Ruby中自动记录异常

5
有没有库或简便的方法可以捕获Ruby程序中抛出的异常并将其记录到文件中?我已经查看了log4rlogger,但两者的文档都没有提供任何关于如何实现此功能的示例。如果有帮助的话,我远程运行此程序并且失去了stdout和stderr的句柄。
你会推荐什么?
5个回答

14

如果你想走一条不一样的路,尝试这个:

class Exception
  alias real_init initialize
  def initialize(*args)
    real_init *args
    # log the error (self) or its args here
  end
end

这将拦截在创建时刻新异常对象的创建。


这个“可以工作”,但似乎以某种方式破坏了Rails 4.x的启动(自动加载?)。 - Duncan Bayne

5

Exception中恢复。类似这样的内容可能是有意义的:

begin
  # run your code here ..
rescue Exception => exception
  # logger.error(...) ....
  raise exception
end

这将记录异常,并重新引发它,以便应用程序实际上会在日志记录之外引发错误。

exceptionException 的一个实例,请查看文档以获取有关此对象的信息(例如访问回溯)。


1
嗯,这正是我担心要做的事情。涉及的代码基本上是一个类,其中有许多方法; 我只需要在每个方法上放置begin / rescue吗?还是有更简单的方法? - Chris Bunch
你可能在某个地方创建了实例 -- 把 rescue 块放在你创建实例的地方。 - August Lilleaas
将其放在实例创建代码上不会有任何好处,除非错误出现在创建过程中。如果您想捕获任何错误,请全局包装主体。 - MarkusQ
我不是在说把它放在“initialize”方法中,而是代码中你调用“.new”的部分。 - August Lilleaas
啊,是的,那看起来也可以行得通。我有点担心每次与这个类进行交互时都要这样做(因为它是在网络上完成的),虽然猴子补丁有点靠不住,但足以胜任工作了。还是感谢你的帮助!+1 - Chris Bunch
rescue 块中,您可以简单地编写 raise,据我所知,这是重新引发刚捕获的异常的惯用方式。 - tokland

2
如果您正在运行Rails应用程序,则异常通知插件非常方便。

啊,是的,我肯定看过它,但我所说的应用程序不是Rails应用程序。谢谢! - Chris Bunch

0

如果我这样做,它会起作用吗:

begin
  main()
rescue Exception => e
  myCustomErrorLogger(e)
end

def main()
  # All the application code comes here.
end

我需要的是将所有未捕获的异常移动到最高级别,并在那里被捕获,并随后由错误日志记录功能记录。
我现在正在尝试这个,但很高兴听取您的建议。

0

您可以调整 Exception 类的代码,以在将原因和回溯放入标准输出时进行修改。

不要忘记检查记录器是否为空,异常可能会在记录器创建之前(或期间)被抛出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接