什么情况下有人“试试......抓住”?这适用于图书馆吗?

时间:2010-10-26 16:20:04

标签: design-patterns templates exception exception-handling

假设您正在设计一个应用程序(WebApp,桌面,任何东西),您需要为代码定义异常处理。既然你想让事情可以重复使用,那么在处理异常时你应该遵循什么逻辑?有任何模式可以遵循吗?

例如,如果某些DLL要使用网络并且网络不可靠,那么覆盖该函数的异常处理程序以重试请求可能是明智的。

开发人员如何处理开发的所有常见方面的异常?是否有任何模式或模板可供使用?

在处理网络,文件,IO,Active Directory和Web等事务时,我确信目前有一些预先设定的最佳实践可以解决最常见和最棘手的问题。他们在哪里?

5 个答案:

答案 0 :(得分:4)

抛出异常当然只能在特殊情况下进行。

对于处理,我想说有两种情况需要捕获异常:

当要完成翻译时

  • 错误代码
  • 另一个例外
  • 用户可以理解的内容

在模块边界

  • 从COM调用返回(例如,进入非异常感知框架)
  • 从一个主题回来(除此之外别无他人)
  • 从回调函数返回(因为回调机制不太可能知道或关心你的异常。)

如果你发现自己正在尝试一下try-catch-cleanup-rethrow类的东西,请使用RAII代替并完全摆脱try ... catch。编写代码,以便在发生异常时以合理的方式执行。查看亚伯拉罕保证,了解有关具体内容的详细信息。


下面对MakerOfThings7的回答,因为评论太长了。

通过“用户可以理解的东西”,我的意思是例如弹出错误消息。

想象一下,如果您愿意,用户点击应用程序UI上的按钮即可获取一些数据。您的按钮单击处理程序将调度到某个数据存储接口。此接口可以从内存流,文件和数据库中获取数据。谁知道?反过来,这些可能会失败,生成MemoryStreamException,FileException或DatabaseException。这些可能已被抛出15个堆栈帧,并且被正确编写的异常安全代码正确地忽略,而不需要翻译它们。

按钮点击处理程序一无所知,因为数据存储接口可以使用不断扩展的数据存储方法。因此,数据存储接口会捕获这些异常,并且将它们转换为通用的DataStorageException。这是抛出的。

然后,调用数据存储接口的按钮单击处理程序捕获此异常,并且有足够的信息可以向用户显示某种类型的失败消息,将异常转换为格式化文本并呈现它。

答案 1 :(得分:0)

一般规则是捕获通用异常并生成特定于域的异常。还有一个API的调试模式,因此您可以记录每个异常,并且可以为将来的版本调试它。

当然这需要良好的调试,因为你不想生成不相关的异常。

只是我的两分钱:)。

答案 2 :(得分:0)

一般来说:

  1. 特殊情况下抛出异常。

  2. 如果有意义,请处理异常。如果您无法处理异常,请允许它向上迁移调用堆栈。

  3. .NET等框架的文档通常描述可以为特定方法调用抛出的异常。

答案 3 :(得分:0)

你回答了自己的问题。如果发生错误的可能性超出了应用程序的控制/范围,则最好进行错误处理。你永远不会有太多的错误处理。只是确保你没有例外编码。

答案 4 :(得分:0)

调试时异常很有用。如果可能的话应该避免它们,因为你应该知道你的控制流程。