2011-09-15 5 views
11

누군가가 예외 처리를 일반적인 메소드로 만들고 메소드 내에서 사용하는 방법이 있다고 말할 수 있습니까? 더 설명해 드리겠습니다.Ruby에서 예외 처리를 일반적인 메소드로 사용

예를 들어, 내 방법 때문에 예외 처리 코드로, 하나의 라인을 필요로하더라도, 다음과 같은 방법

def add(num1, num2) 
begin 
    num1 + num2 
rescue Exception => e 
    raise e 
end 
end 

def divide(num1, num2) 
begin 
    num1/num2 
rescue Exception => e 
    raise e 
end 
end 

당신이 볼 수 있듯이

이, 방법은 더 큰 가져옵니다.

은 내가 찾고 같은 더 슬림 솔루션 (그냥 생각)

def add(num1, num2) 
    num1 + num2 unless raise_exception 
end 

def divide(num1, num2) 
num1/num2 unless raise_exception 
end 

def raise_exception 
    raise self.Exception 
end 

위의 코드가 작동하지 않습니다 유의하시기 바랍니다, 그냥 내 생각이다. 이것이 가능합니까 아니면 다른 좋은 방법이 있습니까?

+0

같은 효과로'def..end'에서'rescue'를 할 수 있기 때문에'begin..end'을 제거함으로써 자세한 표시를 줄일 수 있습니다. – hammar

답변

11
def handle_exception(&block) 
    yield 
rescue Exception => e 
    raise e 
end 

def add(num1, num2) 
    handle_exception { num1 + num2 } 
end 

def divide(num1, num2) 
    handle_exception { num1/num2 } 
end 
+0

고려해야 할 잠재적 인 단점은 제기 된 모든 오류가 동일한 줄 번호 –

+0

참을 가리킬 것이라는 점이지만, 이는 또한 고의적 인 예입니다. 오류를 다시 제기하는 경우 처음에는 오류를 포착하지 않아도됩니다. 이는 일반적인 오류 처리 코드가있는 경우에 유용합니다. – David

+0

@David, 대단히 고마워, 내가 원한 건데 ... : D – sameera207

0

물론, 시작 섹션 내에서 생성되는 메소드로 블록을 전달할 수 있습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 예를 들어 블록 사용량 코드 샘플을 얻으실 수 있습니다. 다시 한 번 감사합니다. – sameera207

+0

그냥 빨리 할 수있을 것 같습니다. –

+0

내 문제가 고쳐졌습니다. 감사합니다. 도움을 청합니다 : D – sameera207

4

네, 그런 일 :

def try 
    yield 
    rescue Exception => e 
    puts 'I`m rescued' 
    end 

    def devide(num1, num2) 
    try { num1/num2 } 
    end 

ruby-1.9.2-p180 :013 > devide(5,1) 
=> 5 
ruby-1.9.2-p180 :014 > devide(5,0) 
I`m rescued 
=> nil 
+0

대답에 감사 드리며, 나는 대답을 먼저 주셨다. 데이비드의 답변을 받아 들여야했다. 미안 ..하지만 다시 한 번 감사드립니다. 내가 원했던 ... – sameera207

0

왜 예외를 구출 않고 afterwords를 인상? 호출 루틴이 예외를 다시 구출해야합니다.

def divide(num1, num2) 
    num1/num2 
end 

begin 
    divide(1,0) 
rescue Exception => e 
    puts "Exception '#{e}' occured" 
end 

당신은 한 줄에 예외를 구출 수 :

def divide2(num1, num2) 
    num1/num2 rescue Exception 
end 

p divide2(6,3) # -> 2 
p divide2(1,0) # -> Exception 

을하지만 당신은 예외가 발생 정보를 잃어 버리게된다

당신은 할 수 있습니다.

관련 문제