サーチ…


前書き

Rustプログラムが重大なエラーが発生した状態になると、 panic!マクロはすぐに終了するように呼び出すことができます(しばしば比較されますが、微妙に異なりますが、他の言語では例外になります)。適切なエラー処理にはResult型が必要ですが、このセクションではpanic!についてのみ説明しpanic!その概念。

備考

パニックが常にメモリリークやその他のリソースリークを引き起こすとは限りません。実際、パニックは一般的にRAIIの不変量を保持し、スタックの解凍時に構造体のデストラクタ(Drop実装)を実行します。しかし、このプロセス中に2回目のパニックが発生した場合、プログラムは単に中止されます。 RAIIの不変の保証は無効です。

パニックに陥らないようにしてください

Rustには、プログラムで何かが間違っていることを示す2つの主な方法があります: Result<T, E>型からの( 潜在的にカスタム定義されたErr(E)返す関数とpanic!

Panickingは、他の言語でよく見られる例外の代替手段ではありません 。 Rustでは、パニックとは何かが重大に間違っていたことを示し、それが継続できないことを示すことです。 pushVecソースからの例を次に示します。

pub fn push(&mut self, value: T) {
    // This will panic or abort if we would allocate > isize::MAX bytes
    // or if the length increment would overflow for zero-sized types.
    if self.len == self.buf.cap() {
        self.buf.double();
    }
    ...
}

メモリが足りなくなった場合、Rustが行うことは他にありませんので、パニック(デフォルトの動作)または中断(コンパイルフラグを設定する必要があります)のいずれかになります。

Panickingは、スタックを巻き戻し、デストラクタを実行し、メモリがクリーンアップされることを保証します。アボートはこれを行わず、OSに依存して適切にクリーンアップします。

次のプログラムを通常どおりに実行してください。

[profile.dev]
panic = "abort"

あなたのCargo.toml

// main.rs
struct Foo(i32);
impl Drop for Foo {
    fn drop(&mut self) {
        println!("Dropping {:?}!", self.0);
    }
}
fn main() {
    let foo = Foo(1);
    panic!("Aaaaaaahhhhh!");
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow