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);
}}
}