Причина, по которой вы не спасаете исключение, заключается в том, что Psych::SyntaxError
не происходит от StandardError
, поэтому простой rescue
не поймает его.Вам нужно указать потомка Psych::SyntaxError
:
>> require 'psych'
=> true
>> begin; raise Psych::SyntaxError; rescue; puts "GOT IT"; end
# Psych::SyntaxError: Psych::SyntaxError
# from (irb):8
# from /Users/donovan/.rvm/rubies/ruby-1.9.2-p180/bin/irb:16:in `<main>'
>> Psych::SyntaxError.ancestors
=> [Psych::SyntaxError, SyntaxError, ScriptError, Exception, Object, PP::ObjectMixin, Kernel, BasicObject]
>> begin; raise Psych::SyntaxError; rescue Exception; puts "GOT IT"; end
GOT IT
Обратите внимание, что в моем примере rescue Exception
его ловит.Как правило, при спасении вы должны быть настолько конкретны, насколько это возможно, если только вам не нужно для спасения всех Exceptions
.Имейте в виду, что подавление обратных трассировок хорошо, когда вы ожидаете исключение, но если вы вообще этого не ожидаете, это значительно усложняет отладку.