abort
and unwind
The previous section illustrates the error handling mechanism panic
.
Different code paths can be conditionally compiled based on the panic setting.
The current values available are abort
and unwind
.
Implementation mechanism of panic
In Rust, there are two ways to implement panic: unwind and abort
- In the unwind mode, when a panic occurs, the function calls will be exited layer by layer. During the process, the local variables in the current stack can be destructed normally.
- The abort method will directly exit the entire program when a panic occurs.
- Generally speaking, by default, the compiler uses the unwind mode.
How to make it yourself:
rustc -C panic=unwind test.rs
rustc -C panic=abort test.rs
abort
Failed with: TOML parsing error: expected an equals, found a newline at line 1 column 5
Original markdown input:
~~~admonish tip title="cfg!(panic='abort'): Building on the prior lemonade example, we explicitly use the panic strategy to exercise different lines of code. " collapsible=true
```rust,editable,mdbook-runnable
fn drink(beverage: &str) {
// You shouldn't drink too much sugary beverages.
if beverage == "lemonade" {
if cfg!(panic="abort"){ println!("This is not your party. Run!!!!");}
else{ println!("Spit it out!!!!");}
}
else{ println!("Some refreshing {} is all I need.", beverage); }
}
fn main() {
drink("water");
drink("lemonade");
}
```
~~~
unwind
Here is another example focusing on rewriting drink() and explicitly use the unwind keyword.
#[cfg(panic = "unwind")] fn ah(){ println!("Spit it out!!!!");} #[cfg(not(panic="unwind"))] fn ah(){ println!("This is not your party. Run!!!!");} fn drink(beverage: &str){ if beverage == "lemonade"{ ah();} else{println!("Some refreshing {} is all I need.", beverage);} } fn main() { drink("water"); drink("lemonade"); }
The panic strategy can be set from the command line by using abort
or unwind
.
rustc lemonade.rs -C panic=abort
cfg! or #cfg
#[cfg(panic = "unwind")]
fn ah(){ println!("Spit it out!!!!");}
cfg!(panic="abort"){ println!("This is not your party. Run!!!!");}