Как подавить, а не распечатать обратную трассировку исключения на терминале в ruby ​​с помощью Thor? - PullRequest
2 голосов
/ 23 августа 2011

Ниже приведен мой метод, который может вызвать исключение.

Это также метод CLI, который я создаю.

Всякий раз, когда возникает исключение, я хочу перехватить это и просто напечататьмое специальное сообщение на терминале.

# variation 1
def self.validate(yaml_path)
  begin
    ....
    ....
  rescue
    puts "Error"
  end
end

# variation 2
def self.validate(yaml_path)
  begin
    ....
    ....
  rescue Exceptino => e
    puts "Error: #{e.message}"
  end
end

Но на терминале печатается обратный след.

Как избежать печати отпечатка обратного следа?

± ../../bin/cf site create                                                                                                                                                                          

ruby-1.8.7-p352
Error during processing: syntax error on line 52, col 10: `          - label: Price'
/Users/millisami/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/yaml.rb:133:in `load': syntax error on line 52, col 10: `          - label: Price' (ArgumentError)
.... backtrace .....
.............

Ответы [ 3 ]

1 голос
/ 23 августа 2011

Следующий код не выводит обратную трассировку.

class CLS
  def hi
    begin
      raise "X"
    rescue
      puts $!.message
    end
  end
end

CLS.new.hi

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

0 голосов
/ 26 августа 2011

Ответ состоял в том, чтобы спасти его в исполняемом файле в bin/<exe>. Спасибо за предложение

begin
  Cf::CLI.start
rescue Psych::SyntaxError
  $stderr.puts "\n\tError during processing: #{$!.message}\n\n"
end
0 голосов
/ 25 августа 2011

Причина, по которой вы не спасаете исключение, заключается в том, что 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.Имейте в виду, что подавление обратных трассировок хорошо, когда вы ожидаете исключение, но если вы вообще этого не ожидаете, это значительно усложняет отладку.

...