2016-06-15 2 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>을 구체적인 유형으로 다운 캐스팅하십시오. 귀하의 경우, I 타입 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 '모든 플랫폼에서 필요하지 않아야합니다. –

관련 문제