Паники
В случае фатальной ошибки времени выполнения Rust вызывает «панику»:
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let v = vec![10, 20, 30];
dbg!(v[100]);
}
- Паника предназначена для неисправимых и неожиданных ошибок.
- Паника — симптом ошибки в программе.
- Ошибки времени выполнения, например неудачная проверка границ, могут вызвать панику.
- Утверждения (например,
assert!) вызывают панику при неудаче. - Панику для конкретных случаев можно вызвать с помощью макроса
panic!.
- Паника «раскручивает» стек (unwind), освобождая значения так же, как если бы функции вернули управление.
- Если аварийное завершение недопустимо, используйте API, которые не паникуют (например,
Vec::get).
This slide should take about 3 minutes.
По умолчанию паника приводит к раскручиванию стека. Раскручивание можно перехватить:
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::panic;
fn main() {
let result = panic::catch_unwind(|| "No problem here!");
dbg!(result);
let result = panic::catch_unwind(|| {
panic!("oh no!");
});
dbg!(result);
}
- Перехват — необычная практика; не пытайтесь реализовать исключения с помощью
catch_unwind! - Это может быть полезно в серверах, которые должны продолжать работу, даже если один запрос завершился аварийно.
- Это не сработает, если в вашем
Cargo.tomlзаданоpanic = 'abort'.