Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Паники

В случае фатальной ошибки времени выполнения 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'.