## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# `abort` 和 `unwind`

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

基于之前的柠檬水示例，我们明确使用 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("柠檬水");
    }

可以通过命令行使用 `abort` 或 `unwind` 来设置 panic 策略。

    rustc  lemonade.rs -C panic=abort