2014-09-18 3 views
-1

예외 처리기를 추가하려고합니다. 수업 시간에 여러 가지 방법이 있으며이 모든 방법에 begin rescue end을 추가하고 싶습니다. 모든 방법에 begin rescue end을 추가하는 대신 한 곳에서 정의 할 수 있습니까?예외 처리

+0

귀하의 상황이 충분히 명확하지입니다. – sawa

+0

처리 방법은 통화 사례에서 동일합니까? –

답변

1

오류 처리를 메서드로 추출하여 다른 모든 메서드에서 호출 할 수 있습니다.

class Foo 
    def method1 
    with_exception_handling do 
     raise 'some error' 
    end 
    end 

    def method2 
    with_exception_handling do 
     puts "normal execution" 
    end 
    end 

    private 
    def with_exception_handling(&block) 
    begin 
     block.call 
    rescue => ex 
     puts "caught exception: #{ex.message}" 
    end 
    end 
end 

f = Foo.new 
f.method1 
f.method2 
# >> caught exception: some error 
# >> normal execution 
1

나는 그것을 감지하기 어려운 버그가 귀하의 테스트 및 오류 로그를 통해 빠져있는 가능성이 높아으로는 광범위한 예외 처리를 위해 좋은 생각이 아니다 일반적으로 생각합니다. 그러나 매우 유스 케이스가 있다면 method_missing을 사용하여 각 메소드의 코드를 변경하지 않고 각 메소드를 구제하는 우아한 방법을 만들 수 있습니다. 당신의 방법은

my_object.my_method 

인 경우

다음과 같은 구문을 허용하는 method_missing을 사용할 수

my_object.my_method_rescued 

예 : 사용자의 오류 처리기에 싸여 그 방법을 실행합니다 어떤 방법 이름에 _rescued을 추가.

이 매우 거친 예를

하지만, 그것은 당신에게 아이디어를 제공해야합니다 :

class MyClass 
    def my_method 
    raise 'error!!!' 
    end 

    def method_missing(method_name, *args) 
    if method_name.to_s.end_with? '_rescued' 
     rescue_wrapper(method_name[0..-9], *args) 
    end 
    end 

    private 
    def rescue_wrapper(method_name, *args) 
    begin 
     self.send(method_name, *args) 
    rescue => e 
     # Error handling code here... 
    end 
    end 

end 


my_object = MyClass.new 
my_object.my_method_rescued # => Calls error handling code on error 
my_ojbect.my_method # => Raises an exception on error 
+0

또는 일부 메타 프로그래밍을 사용하여 오류 처리 방법을 래핑 할 수 있습니다. –