c# - 使用事件而不是异常来实现错误处理

标签 c# design-patterns exception events

我正在编写一些代码,这些代码在其业务和数据层中使用一种模式,使用事件来发出错误信号,例如

resource = AllocateLotsOfMemory();
if (SomeCondition())
{    
    OnOddError(new OddErrorEventArgs(resource.StatusProperty));
    resource.FreeLotsOfMemory();    
    return;
}

从表面上看这看起来很奇怪,尤其是当调用它的代码需要 Hook 到事件中时(有四五个不同的事件!)。

开发人员告诉我,通过这种方式,他们可以在错误处理代码中引用已分配资源的属性,错误发生后清理的责任由这一层负责。

这有点道理。

替代方案可能是这样的

resource = AllocateLotsOfMemory();
if (SomeCondition())
{   
    BigObject temporary = resource.StatusProperty;
    resource.FreeLotsOfMemory();
    throw new OddException(temporary);
}

我的问题是:

  1. 由于异常对象释放时这个“BigObject”被释放,我们是否需要这种模式?

  2. 还有其他人遇到过这种模式吗?如果是这样,你发现了什么陷阱?有什么优势?

谢谢!

最佳答案

我也觉得奇怪。有一些优点 - 例如允许多个“处理程序”,但语义与正常错误处理有很大不同。特别是,它不会自动向上传播到堆栈这一事实让我担心 - 除非错误处理程序本身抛出异常,否则逻辑将继续进行,就好像一切都还好,但它可能应该中止当前操作.

另一种思考方式:假设该方法旨在返回一个值,但您已及早检测到错误。你返回什么值?异常传达了这样一个事实: 没有合适的值可以返回...

关于c# - 使用事件而不是异常来实现错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/148882/

相关文章:

c# - C# 中的字典类 - 两个对象的相等性

c# - 在 View 之间传递数据的最佳方式是什么?

java - Java 应用程序中的 Maker-Checker-Approver

c# - 为什么我必须使用 IoC unity

Java 编译器错误 : Missing Return Statement

c# - 将 Messagebox 放在任何项目的任何 UserControl 中的任何位置时出现 InvalidOperationException

c# - WebClient 从 Google Translate API 返回无法识别的编码?

c# - Azure KeyVault 到期日期更新

c# - 需要使用 ExecuteQuerySegmentedAsync 进行 Azure 表查询的示例

sql - MVC 3/EF/SQL 处理连接、处置和超时