【问题标题】:Best place to handle exceptions处理异常的最佳场所
【发布时间】:2012-09-06 14:20:11
【问题描述】:

在哪里是处理来自较低层的抛出异常的合适位置......在类内部或可能的最高级别?还是取决于用例?

【问题讨论】:

    标签: exception-handling software-design


    【解决方案1】:

    你可以看看this post

    In particular it is now possible (and considered good practice) to set up a top-level exception handler that will handle any unexpected exception on the main thread in a Windows application. This means that it is no longer necessary to have exception handlers in every routine.

    你也可以看看How to implement top level exception handling?

    还有一个Java异常处理链接http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

    因此,作为对您问题的一般回答:我会说是的,这取决于用例(它只是您的简单短脚本还是成熟的应用程序),但您应该尝试在尽可能高的级别,并且在这样做的同时请记住您向用户呈现的消息的“技术性”(相信我,消息“主线程中的错误 31231241”不会改善您的应用程序的用户友好性)。

    编辑: 正如史蒂夫麦康奈尔在他著名的Code Complete 2 book 中所说的那样,应该Throw exceptions on the right level of abstraction - for example if you have a getUser() method and you return IOException then that would be very bad. 但是,是的,我认为这是常识。此外,他说应该以这样的方式编写一个函数,如果其他函数向它发送“垃圾”,它不应该导致整个程序崩溃。

    另外,他赞成使用assertions,他说:Use error handling code for the conditions you expect to occur; use assertions for conditions that should never occur

    最后,声明指出,在解决错误时,您应该牢记以下两种方法:robustnesscorrectness。他在书中为这个例子讲述的故事非常生动,在我读完之后很久就留在了我的脑海中。考虑使用“文本编辑应用程序”并考虑所提供数据的正确性。想象几个像素“疯狂”(你计算错误,或者类似的东西)——如果发生类似的事情,你肯定不会考虑强制关闭应用程序,这被称为 robustness(继续操作)。但是,现在想象一下,您正在制作一个 X 射线操作应用程序——在这种情况下,任何“奇怪的数据”都应该(正如 McConnell 建议的那样)导致严重的错误消息,据说您正在努力争取 正确性 在您的应用程序中。

    附:请原谅 CC2 部分,但我只是喜欢这本书,并且认为每个开发人员都应该阅读它(至少一次)。

    【讨论】:

    • 感谢您的链接。我个人认为应该在应用层处理异常,因为这是定义用例的地方,并且在类中处理异常将严重降低类的可重用性。另一方面,正如OREILLY文章中提到的,如果抛出的异常在应用层没有任何好处,那么它应该在同一级别进行处理。
    • @bolbol:当然,np。是的,这使我们开始陈述,这取决于用例。顺便说一句,看看我的更新。
    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2013-05-09
    • 2011-11-10
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多