パニック

致命的なランタイムエラーが発生すると、Rust は「パニック」を発生させます。

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

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

デフォルトでは、パニックが発生するとスタックがアンワインドされます。アンワインドは捕捉できます。

// 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 を使って 例外を実装しようとしないでください。
  • これは、1 つのリクエストがクラッシュしても動作を継続すべき サーバーでは有用な場合があります。
  • Cargo.tomlpanic = 'abort' が設定されている場合、これは機能しません。