2012-11-02 6 views
3

즉시 스레드에서 예외를 catch하고 모든 스레드를 중지해야하므로 스크립트에서 abort_on_exception을 사용하고 있습니다. 불행히도 이것은 부모 스레드에 예외가 발생하지 않는다는 것을 의미합니다. 예외는 전역 범위에서 발생하기 때문일 수 있습니다. ??ruby는 Thread.abort_on_exception에서 구조를 보거나 중단 할 수 없습니다.

Thread.abort_on_exception = true 

begin 
    t = Thread.new { 
    puts "Start thread" 
    raise saveMe 
    puts "Never here.." 
    } 
    t.join 
rescue => e 
    puts "RESCUE: #{e}" 
ensure 
    puts "ENSURE" 
end 

가 어떻게 abort_on_exception를 사용하는 경우 스레드에서 제기 된 사용자들은 예외를 구출 할 수

어쨌든, 여기에 문제를 보여주는 예입니다?

다음은 좀 더 부끄러운 일을 보여주는 새로운 예입니다. 이 스레드는 begin 블록 내에서 실행을 종료 할 수 있지만 예외를 발생시키지 않고 수행합니다 ??

Thread.abort_on_exception = true 
begin 
    t = Thread.new { raise saveMe }      
    sleep 1 
    puts "This doesn't execute" 
rescue => e 
    puts "This also doesn't execute" 
ensure 
    puts "But this does??" 
end 
+0

예외의 범위가 전 세계적이 아니기 때문입니다. 부모 프로세스는 하위 프로세스를 '베이비시 트'해야합니다. 이것에 대한 스레드 문서를 확인하십시오. – vgoff

+0

[Pickaxe] (http://www.rubycentral.com/pickaxe/tut_threads.html) (좀 오래된 것일 수 있지만 올바른 방향으로 인도해야합니다.) – vgoff

+0

vgoff : Pickaxe 설명서에 이미 알고있는 abort_on_exception이 무엇을 말하고 있는지를 제외하고는 어떤 정보도 가지고 있어야합니다. 나는 '베이비시 트'가 무슨 뜻인지 몰라 - 정교 할 수 있니? 스레드 문서를 읽었으며 스레드를 꽤 많이 사용했지만이 경우 스레드 외부로 오류를 발생시키는 방법을 이해하지 못합니다. –

답변

3

아 - 알아 냈습니다.

abort_on_exception은 분명히 중단을 보냅니다.

begin 
    abort 
    puts "This doesn't execute" 
rescue => e 
    puts "This also doesn't execute" 
ensure 
    puts "But this does?? #{$!}" 
end 

이 솔루션은 또한 중단을 잡는다 '구조 예외'를 사용하는 것입니다 : 스레드는 무관하다, 우리의 구조 중 하나를 기본 중단이 표시되지 않습니다.

begin 
    abort 
    puts "This doesn't execute" 
rescue Exception => e 
    puts "Now we're executed!" 
end 
+0

구조에 대한 예외가 없다는 것을 알지 못해 실망했습니다. :( – vgoff

+2

특히, 'Exception'보다 더 구체적인 예외를 구하는 것이 일반적으로 좋은 생각이기 때문에'SystemExit'을 구출 할 수 있습니다. – lukeasrodgers