情况如下。我希望doStuff()中的所有异常都能在代码中冒出来,以便在更高级别处理它们。
我还想在更高级别记录doStuff()中发生任何异常的频率,目前我正在这样做:
begin
doStuff()
rescue Exception =>
raise e, "specific error to log in a db"
doStuff代码抛出了几十个异常,我希望捕获每个事件以放入db。有一个doStuff2(),它也可以抛出相同的指令,我想知道它们来自哪个函数。
添加额外的字符串似乎改变了异常本身,并且我丢失了原始异常所具有的所有良好格式和跟踪信息。
有关如何重新加入原始异常的任何建议,还要跟踪doStuff()中发生的所有异常?
答案 0 :(得分:48)
如果在不传递任何参数的情况下调用raise
,Ruby将重新引发最后一个异常。
begin
doStuff()
rescue => e
log_exception(e)
raise # This will re-raise the last exception.
end
作为旁注,我想给你一些关于Ruby最佳实践的建议。
doStuff()
方法不遵循Ruby命名约定。您应该使用下划线方法。请使用do_stuff
。此外,如果没有参数,则无需使用()
。Exception
类非常低级,它也会捕获语法错误,以及其他一些编译器问题。在这种情况下,您可能希望让应用程序崩溃,以便您不会部署损坏的应用程序。答案 1 :(得分:3)
您可以保存第一个异常的回溯和消息,并构造一个新的异常来提升
begin
rescue Exception => e
new_ex = Exception.new("Error while executing ...:#{e.message}")
new_ex.set_backtrace(e.backtrace)
raise new_ex
end
答案 2 :(得分:2)
您不能引发新的异常并保存先前的异常及其堆栈跟踪。不幸的是,来自Java世界的嵌套异常并不是开箱即用的。它将在Ruby 2.1中提供。这是一个相当热门的话题。 https://bugs.ruby-lang.org/issues/8257
您仍然可以使用nesty
gem来获取它。您只需要在异常类中include Nesty::NestedError
。更多信息请访问:https://github.com/skorks/nesty/