Null is sloppy because it is the only way in many languages to express something like a union type (in Rust terms, an "enum"). So it gets overloaded to convey information that would be more accurately conveyed by a union type.
The Rust equivalent of null, Option, is just another enum and you can handle it with the standard enum tooling the language gives you such as pattern matching. It also makes you stop and think about what you are doing if you're returning it. In most cases, your intent can be more clearly expressed with an enum other than Option.
This contrived example would be less likely to appear in Rust. Why is there a function called parseFile taking something that might not even be a file?
As an aside, the Rust code could also be written like this:
fn parse_file(file: Option<File>) -> Result<(), String> {
if let None = file {
return Err("File must exist".into());
}
// ...
}