异常处理

struct ScopeCall<FFnMut()> {
    c: F
}
impl<F: FnMut()> Drop for ScopeCall<F> {
    fn drop(&mut self) {
        (self.c)();
    }
}

macro_rules! defer {
    ($e:expr) => (
        let _scope_call = ScopeCall { c: || -> () { $e; } };
    )
}

fn panic_if_true(param: bool) {
    //Guaranteed code execution
    //In case of any return or panic
    defer!(println!("defer"));

    println!("start");
    if param {
        println!("error");
        panic!("test panic");
    }
}

panic_if_true(false);  
//printed:
//start
//defer     

panic_if_true(true);  
//printed:
//start
//error
//defer