02-`abort` 与 `unwind`

abort 与 unwind — Rust By Example

译文 · 基于 Rust By Example

原文链接: https://doc.rust-lang.org/stable/rust-by-example/error/abort_unwind.html

abort 与 unwind

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

在先前柠檬水示例的基础上,我们显式使用 panic 策略来执行不同代码行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
fn drink(beverage: &str) {
    // 你不该喝太多含糖饮料。
    if beverage == "lemonade" {
        if cfg!(panic = "abort") {
            println!("This is not your party. Run!!!!");
        } else {
            println!("Spit it out!!!!");
        }
    } else {
        println!("Some refreshing {} is all I need.", beverage);
    }
}

fn main() {
    drink("water");
    drink("lemonade");
}

下面再看一个例子:改写 drink(),并显式使用 unwind 关键字。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#[cfg(panic = "unwind")]
fn ah() {
    println!("Spit it out!!!!");
}

#[cfg(not(panic = "unwind"))]
fn ah() {
    println!("This is not your party. Run!!!!");
}

fn drink(beverage: &str) {
    if beverage == "lemonade" {
        ah();
    } else {
        println!("Some refreshing {} is all I need.", beverage);
    }
}

fn main() {
    drink("water");
    drink("lemonade");
}

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

1
rustc  lemonade.rs -C panic=abort
最后修改 August 21, 2026: 更新 (76fc81a2e)