我正在编写一些代码,这些代码在其业务和数据层中使用一种模式,使用事件来发出错误信号,例如
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);
}
我的问题是:
由于异常对象释放时这个“
BigObject
”被释放,我们是否需要这种模式?还有其他人遇到过这种模式吗?如果是这样,你发现了什么陷阱?有什么优势?
谢谢!
最佳答案
我也觉得奇怪。有一些优点 - 例如允许多个“处理程序”,但语义与正常错误处理有很大不同。特别是,它不会自动向上传播到堆栈这一事实让我担心 - 除非错误处理程序本身抛出异常,否则逻辑将继续进行,就好像一切都还好,但它可能应该中止当前操作.
另一种思考方式:假设该方法旨在返回一个值,但您已及早检测到错误。你返回什么值?异常传达了这样一个事实: 没有合适的值可以返回...
关于c# - 使用事件而不是异常来实现错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/148882/