Остановка потока изнутри в Rust
Если работа внутри фоновой линии обрывается, снаружи это само не превращается в исключение в основной линии. Ожидание по ручке сообщает об этом через ветку ошибки результата.
Запустим линию, которая останавливается изнутри, и разберем ответ ручки:
use std::thread;
fn main() {
let handle = thread::spawn(|| {
panic!("stop inside");
});
match handle.join() {
Ok(_) => println!("value"),
Err(_) => println!("thread stopped"),
}
}
На экране строка thread stopped.
Успешная ветка не выполняется, потому что
замыкание не вернуло значение наружу.
Тот же разбор удобно сочетать с коротким сообщением до и после ожидания:
use std::thread;
fn main() {
println!("before");
let handle = thread::spawn(|| {
panic!("fail");
});
match handle.join() {
Ok(v) => println!("got {}", v),
Err(_) => println!("join error"),
}
println!("after");
}
Дано число:
let num = 0;
Фоновая линия должна вернуть этот литерал в одном варианте программы и оборваться изнутри в другом. Сравните, что печатает ожидание ручки в каждом случае.
Скажите, дойдет ли основная линия до кода после ожидания, если внутри фоновой работа оборвалась, но снаружи обработали ветку ошибки.
Дано число:
let num = 6;
Запустите линию, которая должна была вернуть литерал, но останавливается до возврата. Выведите короткое сообщение только если ожидание вернуло ошибку.