4

我在 ASPX 页面中有一个 ObjectDataSource,它从业务逻辑类调用 CRUD 操作。当这些操作期间发生异常时,我想通知用户错误并记录它们。但我希望我的业务逻辑和表示层之间有一个清晰的分离。我知道 Selected、Inserted、Updated、Deleted 事件提供了 ObjectDataSourceStatusEventArgs 类型的参数,其中包括发生异常的属性“Exception”。

这些事件的处理程序是处理 ObjectDataSource 异常的最佳位置还是有更好的方法?事件参数链的 Exception 属性是否包含操作过程中发生的所有异常?

欢迎任何意见或建议,

谢谢,

卡伦

4

2 回答 2

2

在 Biz 层对象执行的 CRUD 操作期间引发异常时,它应该由 Biz 对象处理,但只是部分处理。这是因为您希望反馈到达表示层(并且您还希望记录错误)。因此,您可以:

一个。按原样重新抛出异常。这会将它冒泡到您的表示层。

湾。将名称-值数据对添加到Data异常的属性中,然后重新抛出它。

C。将引发的异常包装成自定义异常类型并抛出它。

然后,此异常将冒泡到您的 ObjectDataSource,并且可以通过ObjectDataSourceStatusEventArgs.ExceptionSelected/Inserted/Deleted/Updated 事件处理程序中的属性获得。然后,您应该检查此属性是否为 Null。如果没有,ObjectDataSource会将任何异常(是的,复数!)包装在一个TargetInvocationException包装器中,因此您可能需要获取 InnerException。

然后您可以修改 UI 元素以向用户提供操作未成功完成的必要反馈。此外,您需要将该ExceptionHandled属性设置为 True 以防止异常冒泡到页面级别。

至于记录异常,我个人会在两个层中记录错误 - 业务逻辑层和表示层。

于 2009-04-18T13:21:48.013 回答
0

如果业务逻辑层中的方法被自动调用,我会使用这些事件。

我认为这些事件的目的是:以某种自定义方式显示错误。

但我不会自动调用逻辑层中的方法。相反,我将通过代码调用它们,并返回一个布尔值,指示操作是否成功。

像这样,当插入/更新一个人时:

if (Person.Save(data)) {
  // show OK message
} else {
  // show error message
}

其中 Person 是相对于 Person 数据访问层类的 BAL 类。

希望这有帮助。

于 2009-04-18T13:15:40.540 回答