捕捉恐慌的正确方法是什么?

时间:2015-05-14 08:40:45

标签: error-handling rust

我们经常不希望我们的程序因为超出范围而被停止,除以0或类似的恐慌。但是,std::thread::catch_panic标记为不稳定。我们可以写......

let result = Thread::scoped(move || {
        make_a_division_for_ever()
    }).join();
    if result.is_ok() {
        println!("Finished OK");
    }

这是捕捉恐慌的正确方法(例如除以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);
    }
}

1 个答案:

答案 0 :(得分:7)

在大多数情况下,不会发生生锈恐慌。不稳定的Rust提供了这个功能,但是如果你有一个非常复杂的情况(例如,你正在为其他Rust程序编写测试工具并且需要挂钩到恐慌处理程序中),你应该只使用它,你可以在这里使用它。 ;冒出错误。

在Rust中,错误处理是通过返回Result<T,E> s(有时为Option<T>,使用try!()冒充它们并使用match处理它们来完成的。

大多数恐慌的方法都有非惊慌的版本;例如,divide的检查版本为checked_div(),您可以使用try!从字符串解析中返回错误。