使用自定义错误而不是SystemExit

时间:2017-04-06 18:23:27

标签: ruby exception-handling

我正在处理一个我未能使用raise的应用程序,如下所示:

raise 'Some error happened!'

这导致显示难看的堆栈跟踪,因此我将代码调整为使用abort,如下所示:

abort 'Some error happened!'

完美!现在我可以使用明确的消息退出并且没有堆栈跟踪。

问题出现了,因为在某种情况下我需要从这种情况中解救。我可以这样做:

begin
  abort 'Some error happened!'
rescue SystemExit
  puts 'Rescued'
end

puts 'Moving on...'

# Outputs:
# Some error happened!
# Rescued
# Moving on...

这具有显示中止消息的缺点,尽管被拯救并且挽救了相当模糊的错误。我真正想做的是这样的事情:

class MySuperFancyCustomError < StandardError
  def initialize
    super
    abort 'Some error happened!'
  end
end


begin
  raise MySuperFancyCustomError
rescue MySuperFancyCustomError
  puts 'Rescued'
end

puts 'Moving on...'

# Outputs:
# Some error happened!

但我还没有找到一种方法来设置它,以便我可以从中拯救它。我只需要它继续运行和输出:

Rescued
Moving on...

而不是失败:

Some error happened!

有没有人知道实现这一目标的优雅方式?

1 个答案:

答案 0 :(得分:0)

我强烈建议不要使用abort进行流量控制。相反,试试这个:

class CustomException < StandardError
end

class Example
  def explode
    raise CustomException, "Michael Bay here!"
  end
end

begin
  Example.new.explode
rescue CustomException => e
  puts "This happened: %s" % e
end

在这里,您可以定义自己的异常类型,然后显式捕获它。

现在您将获得此输出,但您可以完全控制显示的方式,时间和时间:

This happened: Michael Bay here!