我们经常不希望我们的程序由于越界、被 0 除或类似的 panic 而停止。然而,std::thread::catch_panic
被标记为不稳定。我们可以写...
let result = Thread::scoped(move || {
make_a_division_for_ever()
}).join();
if result.is_ok() {
println!("Finished OK");
}
这是捕捉 panic 的正确方法吗(比如除以 0 或越界)?
一个完整的例子...
use std::thread::Thread;
fn main() {
println!("Make divisions for ever");
loop {
let result = Thread::scoped(move || {
make_a_division_for_ever()
}).join();
if result.is_ok() {
println!("Finished OK");
}
else {
println!("It CRASHED!!! restarting...");
}
}
}
fn make_a_division_for_ever() {
loop {
println!("Enter divisor...");
let line = std::io::stdin()
.read_line()
.ok()
.expect("error reading line");
let divisor = line.trim()
.parse::<u32>()
.expect("
I coudn't parse your line as an string. I'm going to die
I showed things closer than orion belt...
");
println!("readed {}", divisor);
let dangerous = 1_000_000 / divisor;
println!("DIV RESULT... {}", dangerous);
}
}
最佳答案
在大多数情况下,Rust panic 并不打算被捕获。 Unstable Rust 提供了这个功能,但是你应该只在你遇到非常复杂的情况时才使用它(比如,你正在为其他 Rust 程序编写测试工具并且需要 Hook 到 panic 处理程序)而你不能冒泡错误。
在 Rust 中,错误处理是通过返回 Result<T,E>
来完成的s(有时 Option<T>
,用 try!()
冒泡它们,然后用 match
处理它们。
大多数 panicky 方法都有非 panicky 版本;例如,divide 的检查版本是 checked_div()
, 你可以使用 try!
返回字符串解析的错误。
关于error-handling - 捕获 panic 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30232890/