以下是可能引发异常的方法。
它也是我正在构建的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 .....
.............
答案 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