2016-06-15 6 views
1

放出された後にpanic!(arg)さんのargをどうすれば回収できますか? This文書が明確ではありません。パニックを収集する方法!引数?

panic!(42)私は自分のアプリケーションで42を収集し、中止するのではなく正常に機能しないようにします。

+5

'パニックもし'あなたは、私は信じている...制御コードにされ、一般的には、勧告は[ 'Result']を使用することです(HTTPS ://doc.rust-lang.org/std/result/enum.Result.html)、それに応答したい場合は、パニックの代わりに 'Err(arg)'を返します。 –

+0

私は理解していますが、それでも可能であると言いながら価値を「収集」したいと思います。 –

+3

['catch_unwind()'](https://doc.rust-lang.org/std/panic/fn.catch_unwind.html)(Rust 1.9)は、解き放たれるパニックを処理する出発点になります! (プロセスを直ちに停止するものは除く)。 'arg'はそれが返す' Result'に含まれていなければなりません。 –

答えて

2

引数を収集するには、Box<Any>を具体的なタイプにダウンキャストします。あなたのケースでは、私はタイプi32する42を強制的に:!

use std::thread::spawn; 

fn main() { 
    let thread = spawn(|| { panic!(42_i32); }); 
    let result = thread.join(); 
    match result { 
     Ok(_) => { println!("thread join result ok"); } 
     Err(e) => { 
      match e.downcast::<i32>() { 
       Ok(e2) => { println!("Got an int error: {:?}", e2); } 
       Err(e3) => { println!("Got unknown error: {:?}", e3); }   
      } 
     } 
    } 
} 
+0

なぜ' _i32'ですか? –

+2

'Box 'は具体的な型にダウンキャストしなければならないので、 'panic!(42);'のデフォルトの型が何であるか分からなかったので、 'i32'を使ったところです。私のコンピュータ上では、それは 'i32'ですが、すべてのアーキテクチャ上でそうなるかどうか疑問に思っていました。だから私は42を「i32」にしました。あなたの質問に基づいて私はそれを見て、明らかに 'i32'は[整数のデフォルトタイプ](https://doc.rust-lang.org/book/primitive-types.html#numeric-types)であり、' _i32 'どのプラットフォームでも必要ではありません。 –

関連する問題