3

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

它也是我正在构建的 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 .....
.............
4

3 回答 3

2

答案是在可执行文件中拯救它bin/<exe>感谢您的建议

begin
  Cf::CLI.start
rescue Psych::SyntaxError
  $stderr.puts "\n\tError during processing: #{$!.message}\n\n"
end
于 2011-08-26T06:06:52.190 回答
1

以下代码不输出回溯。

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

CLS.new.hi

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

于 2011-08-23T19:51:32.567 回答
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。请注意,当异常是您所期望的时,抑制回溯是好的,但如果您通常不期望它,它会使调试变得更加困难。

于 2011-08-25T15:17:59.487 回答