パニック(panic)

Rust は「パニック」を使用して致命的なエラーを処理します。

実行時に致命的なエラーが発生すると、Rust はパニックをトリガーします。

fn main() {
    let v = vec![10, 20, 30];
    println!("v[100]: {}", v[100]);
}
  • パニックは、回復不能なエラーや予期しないエラーに使用するためのものです。
    • パニックはプログラムにバグがあることの兆候です。
    • ランタイム エラー(境界チェックの失敗など)は、パニックになる場合があります。
    • アサーション(assert! など)は失敗時にパニックになります。
    • 特定の目的でパニックさせてあい場合には、panic! マクロを使用できます。
  • パニックが発生すると、スタックが「アンワインド」され、関数がリターンされたかのように値がドロップされます。
  • クラッシュが許容されない場合は、パニックが発生しない API(Vec::get など)を使用します。
This slide should take about 3 minutes.

デフォルトでは、パニックが発生するとスタックはアンワインドされます。アンワインドは以下のようにキャッチできます。

use std::panic;

fn main() {
    let result = panic::catch_unwind(|| "No problem here!");
    println!("{result:?}");

    let result = panic::catch_unwind(|| {
        panic!("oh no!");
    });
    println!("{result:?}");
}
  • キャッチは一般的ではないため、catch_unwind を使用して例外処理を実装しようとしないでください。
  • これは、1 つのリクエストがクラッシュした場合でも実行し続ける必要があるサーバーで有用です。
  • これは、Cargo.tomlpanic = 'abort' が設定されている場合は機能しません。