パニック
致命的なランタイムエラーが発生すると、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.tomlでpanic = 'abort'が設定されている場合、これは機能しません。