Panic!

当 Rust 中出现严重错误时,可能会发生panic

让我们看看它对我们来说是什么样子。

main.rs 中将此行放在某处,例如在我们的 println 之前:

panic!("This is a panic");

再次运行代码。

您应该会看到类似于这样的内容:



!! A panic occured in 'src\main.rs', at line 25, column 5

PanicInfo {
    payload: Any { .. },
    message: Some(
        This is a panic,
    ),
    location: Location {
        file: "src\\main.rs",
        line: 25,
        col: 5,
    },
    can_unwind: true,
}

Backtrace:

0x420019aa
0x420019aa - main
    at C:\tmp\getting-started\src\main.rs:25
0x4200014c
0x4200014c - _start_rust
    at ...\.cargo\registry\src\github.com-1ecc6299db9ec823\riscv-rt-0.9.0\src\lib.rs:389

我们看到了 panic 发生的位置,甚至看到了回溯信息!

虽然在这个例子中事情是显而易见的,但这在更复杂的代码中会派上用场。

现在尝试使用 release 模式编译并运行代码:

cargo run --release

现在情况不太好看:


!! A panic occured in 'src\main.rs', at line 25, column 5

PanicInfo {
    payload: Any { .. },
    message: Some(
        This is a panic,
    ),
    location: Location {
        file: "src\\main.rs",
        line: 25,
        col: 5,
    },
    can_unwind: true,
}

Backtrace:

0x42000140
0x42000140 - _start_rust
    at ??:??

我们仍然可以看到 panic 发生的位置,但是回溯信息不太有用了。

这是因为编译器省略了调试信息并优化了代码。

但是你可能已经注意到了烧录二进制文件大小的差异。

它从 199056 字节减少到了 86896 字节!

请注意,对于我们所得到的东西来说,这仍然很大。有许多选项可以使二进制文件更小,这超出了本书的范围。

在继续之前,请删除引起明确 panic 的行。