abortunwind

上一节介绍了错误处理机制 panic。可以根据 panic 设置有条件地编译不同的代码路径。当前可用的值有 unwindabort

基于之前的柠檬水示例,我们明确使用 panic 策略来执行不同的代码行。

fn drink(beverage: &str) {
    // 你不应该喝太多含糖饮料。
    if beverage == "柠檬水" {
        if cfg!(panic = "中止") {
            println!("这不是你的派对。快跑!!!!");
        } else {
            println!("快吐出来!!!!");
        }
    } else {
        println!("来点清爽的{}就是我现在需要的。", beverage);
    }
}

fn main() {
    drink("水");
    drink("柠檬水");
}

这里是另一个示例,重点是重写 drink() 函数并明确使用 unwind 关键字。

#[cfg(panic = "unwind")]
fn ah() {
    println!("快吐出来!!!!");
}

#[cfg(not(panic = "unwind"))]
fn ah() {
    println!("这不是你的派对。快跑!!!!");
}

fn drink(beverage: &str) {
    if beverage == "柠檬水" {
        ah();
    } else {
        println!("来点清爽的{}就是我现在需要的。", beverage);
    }
}

fn main() {
    drink("水");
    drink("柠檬水");
}

可以通过命令行使用 abortunwind 来设置 panic 策略。

rustc  lemonade.rs -C panic=abort