Rust
パニックとアンワインド
サーチ…
前書き
Rustプログラムが重大なエラーが発生した状態になると、
panic!
マクロはすぐに終了するように呼び出すことができます(しばしば比較されますが、微妙に異なりますが、他の言語では例外になります)。適切なエラー処理にはResult
型が必要ですが、このセクションではpanic!
についてのみ説明しpanic!
その概念。
備考
パニックが常にメモリリークやその他のリソースリークを引き起こすとは限りません。実際、パニックは一般的にRAIIの不変量を保持し、スタックの解凍時に構造体のデストラクタ(Drop実装)を実行します。しかし、このプロセス中に2回目のパニックが発生した場合、プログラムは単に中止されます。 RAIIの不変の保証は無効です。
パニックに陥らないようにしてください
Rustには、プログラムで何かが間違っていることを示す2つの主な方法があります: Result<T, E>
型からの( 潜在的にカスタム定義された ) Err(E)
返す関数とpanic!
。
Panickingは、他の言語でよく見られる例外の代替手段ではありません 。 Rustでは、パニックとは何かが重大に間違っていたことを示し、それが継続できないことを示すことです。 push
のVec
ソースからの例を次に示します。
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