2009-04-16 2 views
1

직접 발생한 Ruby Exceptions에 포함 된 메시지와 evals 내에서 제기 된 메시지 사이에는 이상한 차이가있는 것으로 보입니다. 예를 들어, 다음 코드Ruby : 평가 내에서 발생하는 예외에서 원하지 않는 컨텍스트

, I 번째 컨텍스트없이 예외를 발생시킬 수있는 방법을 알아 서브로 정규 표현식들을 사용의 짧은
Rescue foo 
Help! 

Rescue eval 'foo' 
./temp.rb:2:in `foo': Help! 

있다 :

def foo 
raise "Help!" 
end 

puts "\nRescue foo" 
begin 
foo 
rescue RuntimeError => e 
puts e.message 
end 

puts "\nRescue eval 'foo'" 
begin 
eval "foo" 
rescue RuntimeError => e 
puts e.message 
end 

는 다음 출력을 생성 케이스?

답변

1

그것은 이상한 일입니다. 그 정보를 추가하지 평가 설득하는 방법을 볼 수 없습니다, 그러니 당신은 당신이 언급 한 munging 정규 표현식을, 또는 당신은 당신의 자신의 오류 유형을 정의 할 수 있습니다 출력으로

class MyError < RuntimeError 
    attr_accessor :my_message 
    def initialize(m) 
    @my_message = m.dup 
    super 
    end 
end 

def foo 
raise MyError.new("Help!") 
end 

puts "\nRescue eval 'foo'" 
begin 
eval "foo" 
rescue RuntimeError => e 
puts e.my_message 
end 

:

Rescue eval 'foo' 
Help! 

간단한 스크립트보다 더 큰 것에서는 자신의 오류 유형을 정의하는 것이 좋습니다.

2

감사 (크리스는 그의 대답에 말에 맞춰 코드를 해결하기 위해 업데이트). 어쨌든 내 자신의 오류를 정의하고 있었기 때문에 쉽게 해결할 수 있습니다.

슈퍼 클래스뿐만 아니라 초기화되도록 내가 약간 변경 한

:

class MyException < RuntimeError 
    attr_accessor :my_message 
    def initialize(m) 
    @my_message = String.new(m) 
    super 
    end 
end 

합니다 (String.new 호출이 다시 이전 동작을 입지 않도록 필요한 것 같다, 아마 Exception.new 현재 위치에서 메시지를 수정합니다.)

+0

좋은 점이 모두 있습니다. –