【问题标题】:What is the best way to handle ObjectDataSource exceptions?处理 ObjectDataSource 异常的最佳方法是什么?
【发布时间】:2009-04-18 12:17:17
【问题描述】:
我在 ASPX 页面中有一个 ObjectDataSource,它从业务逻辑类调用 CRUD 操作。当这些操作期间发生异常时,我想通知用户错误并记录它们。但我希望我的业务逻辑和表示层之间有一个清晰的分离。我知道 Selected、Inserted、Updated、Deleted 事件提供了一个 ObjectDataSourceStatusEventArgs 类型的参数,其中包括一个属性“Exception”,用于表示发生的异常。
这些事件的处理程序是处理 ObjectDataSource 异常的最佳位置还是有更好的方法?事件参数的 Exception 属性是否将操作过程中发生的所有异常都链了起来?
欢迎任何cmets或建议,
谢谢,
库伦
【问题讨论】:
标签:
c#
asp.net
objectdatasource
【解决方案1】:
当您的 Biz 层对象执行 CRUD 操作期间引发异常时,它应该由 Biz 对象处理,但只是部分处理。这是因为您希望反馈到达表示层(并且您还希望记录错误)。因此,您可以:
一个。按原样重新抛出异常。这会将其冒泡到您的 Presentation 层。
b.向异常的Data 属性添加名称-值数据对,然后重新抛出它。
c。将引发的异常包装成自定义异常类型并抛出它。
然后,此异常将冒泡到您的 ObjectDataSource,并通过 Selected/Inserted/Deleted/Updated 事件处理程序中的 ObjectDataSourceStatusEventArgs.Exception 属性提供。然后,您应该检查此属性是否为 Null。如果没有,ObjectDataSource 会在TargetInvocationException 包装器中包装任何异常(是的,复数!),因此您可能需要处理InnerException。
然后您可以修改 UI 元素以向用户提供操作未成功完成的必要反馈。此外,您需要将 ExceptionHandled 属性设置为 True 以防止异常冒泡到页面级别。
至于记录异常,就个人而言,我会在两个层中记录错误 - 业务逻辑层和表示层。
【解决方案2】:
如果业务逻辑层的方法被自动调用,我会使用这些事件。
我认为这些事件的目的是:以某种自定义方式显示错误。
但我不会自动调用逻辑层中的方法。相反,我将通过代码调用它们,并返回一个布尔值,指示操作是否成功。
插入/更新人时类似这样:
if (Person.Save(data)) {
// show OK message
} else {
// show error message
}
其中 Person 是相对于 Person 数据访问层类的 BAL 类。
希望对您有所帮助。