Exceptions or Errors (in rust) is a state of a program when a piece of code does not execute as it should. It may be due to a resource that should be available at this time but is not. It may be due to a condition not fulfiled or a buggy network stream. But errors occur all the time. A good programmer is one who anticipates them and make logic to circumnavigation them, for example, while writing to a file check its permission or check if the file exists in the first place, if not make the file first and then write on it. Rust enforce the developer to make sure that all the contingencies are met before the program is compiled, this makes Rust less prone to an erroneous behaviour. Rust has two type of Errors
recoverable errors,
unrecoverable errors.
Unrecoverable Error in Rust
These are those Error, if occur, program execution is
aborted. It is possible to explicitly throw an Unrecoverable Error using
panic! macro, For instance
fn main() {
panic!("Abandon Ship!");
}
But there are condition where such error are thrown by the library itself, for instance
fn main() {
let mut primes=Vec::new();
primes.push(2);
primes.push(5);
primes.push(7);
primes.push(11);
println!("Try getting 5th index:{:?}",primes[5]); //This will throw an Unrecoverable Error after which program execution is stopped.
}
Here the code is trying to access the fifth index of the
Vector, which has only 4 items in it. In
C language this is a major security loophole that is exploited, but Rust save us from arbitrary access
un-authorized areas of the memory.
Recoverable Errors with Result
Most Error situaions can be handled by a
contingency. Such conditions are not fatal for programm execution and can be dealt with.
use std::fs::File;
fn main() {
let f = File::open("Cargo.toml");
let _f = match f {
Ok(file) => file,
Err(error) => panic!("Problem opening the file: {:?}", error),
};
// READ THE FILE, NOW WE HAVE THE HANDLE ON IT
}
Here we are trying to get the
handle of a file. There can be numerous ways that can lead to an Error condition, but we can avoid them by the check the return type of the
Ok construct. Which if, returned type is of
file then proceed otherwise trigger an error condition. You can check it by specifying a filename that does not exist, say
NoCargo.toml.
A simpler version of the above program is
fn main() {
let _f = File::open("Cargo2.toml").expect("Cannot find the file");
}
// SAME AS ABOVE CODE, BUT SIMPLER!
Use
expect function that can eliminate extra code.