如何使用Thor抑制和不在ruby中打印终端上的异常回溯?

时间:2011-08-23 19:29:57

标签: ruby exception thor

以下是可能引发异常的方法。

它也是我正在构建的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 个答案:

答案 0 :(得分:1)

以下代码不会输出回溯。

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

CLS.new.hi

您是否检查过堆栈中是否还有另一个方法正在抢救异常,输出堆栈跟踪然后重新引发异常?

答案 1 :(得分:0)

你没有拯救这个例外的原因是因为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,否则你通常应该在救援时尽可能具体。请注意,当异常是您期望的时候,抑制回溯是好的,但是如果您不期望它通常会使调试变得更加困难。

答案 2 :(得分:0)

答案是在bin/<exe>的可执行文件上解救它。 Thanks for suggesting

begin
  Cf::CLI.start
rescue Psych::SyntaxError
  $stderr.puts "\n\tError during processing: #{$!.message}\n\n"
end