2013-03-13 3 views
3

Мне нужно добавить информацию об отладке ко всем исключениям, которые происходят внутри блока, но я не хочу испортить обратную трассировку. $!, похоже, не допускает этого в 1.9.3; raise заменяет backtrace независимо от того, что я пытаюсь.Ruby: Предоставить информацию для сообщений об исключениях, не касаясь stacktrace

Идеи?

Вот что я использовал первоначально:

def self.load(filename, virtual_path = nil) 
    t = Template.new(filename, virtual_path) 
    t.is_page? ? Page.new(t) : t 
rescue 
    raise $!, "Error loading template '#{filename}'#{virtual_path ? " under virtual path '" + virtual_path + "'" : ""}: #{$!}" 
end 

Лучшее, что я нашел до сих пор это:

def self.load(filename, virtual_path = nil) 
    t = Template.new(filename, virtual_path) 
    t.is_page? ? Page.new(t) : t 
rescue => e 
    raise e, "Error loading template '#{filename}'#{virtual_path ? " under virtual path '" + virtual_path + "'" : ""}: #{e.message} #{e.backtrace}" 
end 

Это отвалы оригинальный трассировки стека в сообщение, но по-прежнему Безразлично не сохраняйте старую трассировку стека в качестве трассировки стека

+1

Независимо от того, что вы пробовали в своем описании, что, в свою очередь, поможет нам предложить вам что-то лучшее. –

+0

Я обновил вопрос примерами –

ответ

3

Если вы посмотрите на метод Kernel#raise, это может занять три pa араметры:

raise(exception [, string [, array]]) 

Если вы хотите сохранить трассировку, необходимо указать параметр array, который обратный вызов информации.

Пример:

Допустим, вы изначально были:

def some_method() 
    raise('original message') 
end 

some_method 
#=> scratch.rb:10:in `some_method': original message (RuntimeError) 
# from scratch.rb:16:in `<main>' 

Вы можете использовать третий параметр, за исключением поднять новое исключение с новым сообщением и тот же трассировку:

def some_method() 
    begin 
     raise('error message') 
    rescue 
     raise $!, 'new message', $!.backtrace 
    end 
end 

some_method 
#=> scratch.rb:10:in `some_method': new message (RuntimeError) 
#  from scratch.rb:16:in `<main>' 

Как вы можете видеть, новое исключение совпадает с исходным исключением, за исключением обновленного сообщения.

+0

Отлично, спасибо! –

Смежные вопросы