Panic 恐慌

让我们回顾一下在“变量”章节中编写的 speed 函数。大概像这样:

#![allow(unused)]
fn main() {
fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 {
    let distance = end - start;
    distance / time_elapsed
}
}

如果你观察细致的话,可能会发现一个问题1:如果 time_elapsed 为零怎么办?

你可以在Rust playground上试一试。程序会以以下错误退出:

thread 'main' panicked at src/main.rs:3:5:
attempt to divide by zero

这就是所谓的panic

panic是Rust表明出现了严重错误,程序无法继续执行,是不可恢复的错误2。除以零属于这类错误。

panic! 宏

你可以通过调用 panic!3故意触发恐慌:

fn main() {
    panic!("This is a panic!");
    // The line below will never be executed
    let x = 1 + 2;
}

Rust 还有其他处理可恢复错误的机制,我们将在稍后讨论。 目前,我们将使用恐慌作为简单但直接的临时解决方案。

参考

本节练习位于 exercises/02_basic_calculator/04_panics

深入一步阅读

1

speed 还有另一个问题,我们很快会解决。你能发现吗?

2

你可以尝试捕获恐慌,但这应作为最后的手段,仅保留于特定情况。

3

如果后面跟着 !,那便是宏的调用法。目前可以把宏想象为加了调料的函数。我们将在课程后面更深入地讲解它们。