macro_rules! attempt { (@recurse ($a:expr) { } catch ($e: ident) $b:block) => { ... }; (@recurse ($a:expr) { $e:expr; $($tail:tt)* } $($handler:tt)*) => { ... }; ({ $e:expr; $($tail:tt)* } $($handler:tt)*) => { ... }; }
Expand description
Try to run the first block of code and,
upon error, run the second block of code.
Each step in the block of code must
return Result<Ok(_), Err(e)>
.
§Example
use mpstthree::attempt;
fn do_step1() -> Result<(), String> {
println!("Step 1");
Ok(())
}
fn do_step2() -> Result<(), String> {
println!("Step 2");
Err("Error in step 2".into())
}
fn do_step3() -> Result<(), String> {
println!("Step 3");
Ok(())
}
fn main() {
attempt! {{
do_step1();
do_step2();
do_step3();
} catch (e) {
println!("Failed to perform necessary steps: {e:?}");
}}
}