Часто мы не хотим, чтобы наша программа останавливалась из-за пределов, деление на 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);
}
}
Правильный способ не в первую очередь паниковать, а использовать правильную обработку ошибок, возвращать ошибки и подобные вещи. –
Это отлично, но легко забыть о проверке целочисленного деления. легко получить панику за пределы доступа к элементам в векторе с помощью []. Это несколько примеров. Rust отлично справляется с компиляцией проверки, но это не заставляет нас проверять границы на векторном доступе (при использовании «[]» ни проверки силы на целочисленное деление. –
Ошибка разделения или за пределами доступа являются логическими ошибками и должны быть Исправлено. Я понимаю, что может быть неудобно, что программа прерывается, но в C (++) она все равно сработает. – PEPP