2013-07-06 3 views
1

예외에 대한 기본 동작은 어떻게 구현합니까? begin rescue else가 작동하지 않습니다 (필자도 그렇게 생각합니다).루비의 기본 예외 처리

그리고 시나리오에서는 의미가 없습니다 else? 예외가 발생할 때 실행해야하는 코드는 begin-rescue 블록 사이에서 실행됩니다.

그런데 다음 해결 방법이 있지만 만족스럽지 않습니다. 모든

class MyException < Exception 
end 

class YourException < Exception 
end 

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue Exception => e 
    case e.message 
    when /MyException/ 
    puts "MyException Caught" 
    else 
    puts "Default Exception Caught" 
    end 
end 
+0

MyException을 구제 한 다음 예외를 구해야합니다 (이전에 왜 그 일을하지 않았는지 모르겠 음) : – oozzal

답변

5

첫째, 당신은 정말Exception 서브 클래스는 안된다. 의 슈퍼 클래스 모두NoMemoryError, SyntaxError, Interrupt, SystemExit을 포함한 루비 예외; 이 모든 것들은 일반적으로 구출 할 필요가 없습니다. 실수로 또는 의도적으로 실행하는 것은 프로그램이 사용자에 의해 중단 되더라도 프로그램이 올바르게 종료되지 못하게하므로 권장하지 않습니다. 또한 숨겨진 버그를 숨기거나 생성 할 수도 있습니다.

하위 클래스로 지정할 항목은 StandardError으로, 일상적인 프로그래밍에서 볼 수있는 대부분의 루비 오류의 수퍼 클래스입니다. 나는 이것이 당신이 찾고있는 "기본 동작"이라고 생각

begin 
    object.do_something! 
rescue => error # will rescue StandardError and all subclasses 
    $stderr.puts error.message 
end 

:이 클래스는 또한 당신이 하나를 지정하지 않아야합니다 rescue D가 될 것입니다. 당신은 일반적으로 특정 오류, 다른 모든 오류를 처리 할 수 ​​

class CustomApplicationError < StandardError 
end 

begin 
    object.do_something! 
rescue CustomApplicationError => error 
    recover_from error 
rescue => error 
    log.error error.message 
    raise 
end 

else 절은 오류 처리에서 의미가 없습니다. 아무런 예외도 발생시키지 않으면 코드를 실행하지 않는 ensure 절과 반대로 중첩 된 코드를 실행합니다. 그것은 당신이 성공 경우를 처리 할 수 ​​있습니다.

begin 
    object.do_something! 
rescue => error 
    log.error error.message 
else 
    log.info 'Everything went smoothly' 
end 
+0

else 절은 그다지 큰 의미가 아닙니다. 기본 예외 상황을 처리하는 방법. 내가 그것을 얻 자마자 다른 의미가있었습니다. 응답 주셔서 감사합니다. :) – oozzal

+0

알아 냈어. 두 번째 코드 블록은 의미가 있습니다. "Exception"을 구하지 않고 단지 다른 예외를 위해 구조를 사용하십시오. 감사합니다 :) – oozzal

1

먼저 오류 메시지와 함께 대소 문자가 구별되는 이유를 이해하지 못합니다. 왜 수업 자체로 오류 자체로하지 않습니까? 그러면 다음과 같이됩니다.

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue Exception => e 
    case e 
    when MyException 
    puts "MyException Caught" 
    else 
    puts "Default Exception Caught" 
    end 
end 

둘째, 위와 같이하는 것이 쉬운 방법은 아닙니다. 그것을 할 올바른 방법은 다음과 같습니다 StandardError의 서브 클래스했다

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue MyException 
    puts "MyException Caught" 
rescue Exception 
    puts "Default Exception Caught" 
end 

YourException 경우,이 예외 클래스를 지정하지 않고 rescue에 의해 포착 될 수있다.

+0

그래, 그게 옳은 대답이고 나는 (코멘트에 언급 된대로) 나중에 알아 냈어. 그래도 고마워. :) – oozzal