自从 Microsoft 推出应用程序块以来,我一直在遇到使用异常处理应用程序块的人。我最近仔细观察了自己,并将基本功能总结如下(如果您已经知道它的作用,请跳过以下块):
异常处理应用程序块旨在集中并使用配置文件完全可配置以下关键异常处理任务:
- 记录异常
- 替换异常
- 包装异常
- 传播异常
- 等等
该库通过让您修改 try catch 块来做到这一点,如下所示:
try { // Run code. } catch(DataAccessException ex) { bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy"); if (rethrow) { throw; } }
根据 app.config 中为策略名称指定的内容(请参阅此处的文档),HandleException 将...
- 抛出一个全新的异常(替换原来的异常)
- 将原始异常包装在一个新异常中并抛出该异常
- 吞下异常(即什么都不做)
- 你有没有重新抛出原来的异常
此外,您还可以预先对其进行配置以执行更多操作(例如记录异常)。
现在这是我的问题:我完全看不出无论是替换、包装、吞下还是重新抛出异常,使其可配置有什么好处。根据我的经验,这个决定必须在您编写代码时做出,因为当您更改异常处理行为时,您通常必须更改周围或调用代码。
例如,当您重新配置时,您的代码可能会开始出现不正确的行为,使得在特定点抛出的特定异常现在被吞没而不是重新抛出(catch 块之后可能有代码在发生异常时不得执行)。异常处理中所有其他可能的更改也是如此(例如,替换 -> 重新抛出,吞下 -> 包装)。
所以,对我来说,最重要的是异常处理块解决了实际上不存在的问题。异常记录和通知位很好,但不是所有其他的东西只是过度工程的完美例子吗?