如何实现顶级异常处理?

时间:2009-03-05 21:44:13

标签: exception-handling

我最近不得不为同事开发的现有服务开发一个额外的模块。他在主要工作函数中放置了一个try / catch块,用于捕获冒泡到这个级别的所有未处理异常,将它们与堆栈跟踪信息一起记录下来:

try
{
    // do main work
}
catch(Exception ex)
{
    // log exception info
}

虽然这使得程序非常稳定(如'不太可能崩溃'),但我讨厌它,因为当我测试我的代码时,我没有看到由它引起的异常。当然,我可以查看异常日志并查看是否有新条目,但我更喜欢直接反馈在抛出异常时获取异常(请将光标放在代码的右侧)。 / p>

至少在我还在编码和测试的时候,我删除了这个顶级的try / catch。但是现在我的任务已经完成,我必须决定是否将其重新用于发布,或者不是。 我认为我应该这样做,因为它使服务更稳定,而且它的全部意义在于它在后台运行而不需要任何监督。另一方面,我读过一个人应该只调用特定的例外(如IoException),而不是一般Exception

您对此问题的建议是什么?

顺便说一句,该项目是用C#编写的,但我也对非.NET语言的答案感兴趣。

5 个答案:

答案 0 :(得分:12)

放回去。

该例外应仅在测试时有用。否则它没有意义弹出给用户。

记录很好。

您还可以使用Visual Studio定义的DEBUG符号将调试版本作为标志。

    ...
    } catch( Exception e ) { 
#if DEBUG
          throw;
#else
          log as usual 
#endif
    }

因此,下次需要修改时,调试标志应设置为true,并弹出异常。

答案 1 :(得分:4)

在任何Java应用程序中,您总是希望为未捕获的异常定义异常处理程序,如下所示:

Thread.setDefaultUncaughtExceptionHandler( ... );

其中捕获这些未捕获异常的对象将至少记录失败,以便您有机会了解它。否则,我们无法保证您甚至会收到一条线程出现异常的通知 - 除非它是您的主线程。

除了这样做之外,我的大多数线程都有一个try / catch,我将捕获RunnableException(但不是Error)并记录它...当发生这种情况时,一些线程会死掉其他人将记录并忽略,其他人将向用户显示投诉并让用户决定,具体取决于应用程序的需求。这个try / catch是Thread的根,在Runnable.run()方法或等价物。由于try / catch位于Thread的根目录下,因此无需有时禁用此catch。

当我用C#编写时,我的编码类似。但这一切都取决于应用程序的需要。是一个会破坏数据的例外吗?那么,不要抓住并忽略它。总是记录它,但然后让应用程序死掉。但是,大多数例外都不属于这种情况。

答案 2 :(得分:2)

理想情况下,您希望尽可能地处理异常,但这并不意味着全局异常处理程序是个坏主意。特别是对于必须不惜一切代价保持运行的服务。我会继续你一直在做的事情。在调试时禁用它,但将其留在原处进行生产。

请记住,它应该用作安全网。仍然试图在它们提升到那么远之前捕捉所有异常。

答案 3 :(得分:2)

抓住所有异常并使程序“稳定”的冲动非常强烈,这个想法对每个人来说都是非常诱人的。你指出的问题是,这只是一个诡计,程序很可能是错误的,更糟糕​​的是,没有失败的迹象。没有人定期监控日志 我的建议是试图说服其他开发人员进行大量测试,然后将其部署在生产中,而不是外部捕获。

答案 4 :(得分:1)

如果要在发生异常时查看异常,可以在Visual Studio中进入DEBUG菜单,选择EXCEPTIONS,并且只要抛出异常就可以告诉调试器中断。你甚至可以选择什么类型的例外。 :)