2016-08-13 4 views
4

특별한 경우에 NameError를 잡아야합니다. 그러나 NameError의 모든 하위 클래스를 포착하고 싶지는 않습니다. 이것을 달성 할 수있는 방법이 있습니까?Reseue NameError (NoMethodError 제외)

begin 
    # your code goes here 
rescue NameError => exception 
    # note that `exception.kind_of?` will not work as expected here 
    raise unless exception.class.eql?(NameError) 

    # handle `NameError` exception here 
end 

답변

2

당신은 예외 인상을 다시 할 수 있습니다 예외 메시지를 표시하고 수행 할 작업을 결정하십시오. 제공 한 코드를 사용한 예입니다.

# This shall be catched 
begin 
    String::NotExistend.new 
rescue NameError => e 
    if e.message['String::NotExistend'] 
    puts 'Will do something with this error' 
    else 
    raise 
    end 
end 

# This shall not be catched 
begin 
    # Will raise a NoMethodError but I don't want this Error to be catched 
    String.myattribute = 'value' 
    rescue NameError => e 
    if e.message['String::NotExistend'] 
    puts 'Should never be called' 
    else 
    raise 
    end 
end 
+0

이 솔루션은 내 필요에 맞습니다. – PascalTurbo

4

또한보다 전통적인 방법으로 그것을 할 수

begin 
    # your code goes here 
rescue NoMethodError 
    raise 
rescue NameError 
    puts 'Will do something with this error' 
end 
+1

'NoMethodError'에서만 작동하며 현재 또는 미래에 다른 하위 클래스에서는 작동하지 않습니다. – smefju

0

또한 확인할 수의 클래스가 주어진 다른 경우

# This shall be catched 
begin 
    String::NotExistend.new 
rescue NameError 
    puts 'Will do something with this error' 
end 

# This shall not be catched 
begin 
    # Will raise a NoMethodError but I don't want this Error to be catched 
    String.myattribute = 'value' 
rescue NameError 
    puts 'Should never be called' 
end 
+0

그리고'String :: NotExistend2'가 있다면 어떻게 될까요? http://stackoverflow.com/a/38931436/1941418 – smefju

+1

에 대한 답변으로 예외 클래스를 확인하는 것이 좋습니다. 모든 "특별한"사례가 무엇인지에 달려 있다고 생각합니다. 요점은 특정 예외에 대한 매우 구체적인 정보를 걸러 낼 수 있다는 것입니다. 클래스를 확인하는 것이 모든 특수한 경우를 사용하는 것보다 더 많이 사용한다면, 그렇지 않으면 다른 옵션을 사용할 수 있습니다. – nPn