代码之家  ›  专栏  ›  技术社区  ›  Treb

如何实现顶级异常处理?

  •  9
  • Treb  · 技术社区  · 17 年前

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

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

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

    至少在我还在编码和测试的时候,我删除了这个顶级的try/catch。但是现在我的任务已经完成了,我必须决定是把它放回发布,还是不放。 我认为我应该这样做,因为它使服务更加稳定,而且它的全部要点是它在后台运行而不需要任何监督。另一方面,我读到人们应该只调用特定的异常(如 IoException ),而不是一般性的 Exception .

    你对这个问题有什么建议?

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

    5 回复  |  直到 17 年前
        1
  •  12
  •   Sergio Acosta    17 年前

    把它放回去。

    伐木很好。

    您还可以使用Visual Studio为调试生成定义的调试符号作为标志。

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

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

        2
  •  4
  •   Eddie    17 年前

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

    Thread.setDefaultUncaughtExceptionHandler( ... );
    

    捕获这些未捕获异常的对象将至少记录失败,以便您有机会了解它。否则,不能保证您甚至会收到线程发生异常的通知——除非它是您的主线程。

    除此之外,我的大多数线程都有一个try/catch,我将在其中进行捕获 RunnableException (但不是 Error )并记录它。。。发生这种情况时,一些线程将死亡,其他线程将记录并忽略,其他线程将向用户显示投诉,并让用户根据应用程序的需要做出决定。这个try/catch位于线程的最根,在 Runnable.run()

    当我用C#编写代码时,我的代码与之类似。但这一切都取决于应用程序的需要。异常是否会损坏数据?那么,不要抓住它,忽略它。始终记录它,然后让应用程序死掉。然而,大多数例外情况并非如此。

        3
  •  2
  •   Kenneth Cochran    17 年前

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

    请记住,它应该被用作安全网。在异常升级到如此程度之前,仍然尝试捕获所有异常。

        4
  •  2
  •   Mohit Chakraborty    17 年前

    捕捉所有异常并使程序“稳定”的冲动非常强烈,这个想法对每个人来说都非常诱人。您指出的问题是,这只是一个诡计,程序很可能有缺陷,更糟糕的是,没有故障迹象。没有人定期监视日志。
    我的建议是,试着说服其他开发人员进行广泛的测试,然后在生产中部署它,而不使用外部捕获。

        5
  •  1
  •   Chris Woodruff    13 年前

    如果要在异常发生时查看异常,可以在VisualStudio中转到“调试”菜单,选择“异常”,然后告诉调试器在引发异常时立即中断。您甚至可以选择什么类型的异常。:)