我在ASPX页面中有一个ObjectDataSource,它从业务逻辑类调用CRUD操作。当在这些操作期间发生异常时,我想告知用户错误并记录它们。但我想要在业务逻辑和表示层之间进行明确的分离。我知道Selected,Inserted,Updated,Deleted事件提供了ObjectDataSourceStatusEventArgs类型的参数,其中包含发生异常的属性“Exception”。
这些事件的处理程序是处理ObjectDataSource异常的最佳位置还是有更好的方法?事件参数链的Exception属性是否在操作期间发生了所有异常?
欢迎提出任何意见或建议,
谢谢,
库伦
答案 0 :(得分:2)
当您的Biz层对象执行的CRUD操作期间引发异常时,它应由Biz对象处理,但部分处理。这是因为您希望反馈到达表示层(并且您还想记录错误)。因此,你可以:
一个。按原样重新抛出异常。这会将其冒充到您的表示层。
湾将名称 - 值数据对添加到异常的Data
属性,然后重新抛出它。
℃。将引发的异常包装到自定义异常类型中并抛出它。
然后将此异常冒泡到您的ObjectDataSource,并通过Selected / Inserted / Deleted / Updated事件处理程序中的ObjectDataSourceStatusEventArgs.Exception
属性提供。然后,您应该检查此属性是否为空。如果没有,ObjectDataSource在TargetInvocationException
包装器中包装任何异常(是的,复数!),因此您可能需要获取InnerException。
然后,您可以修改UI元素,以便向用户提供操作未成功完成的必要反馈。此外,您需要将ExceptionHandled
属性设置为True,以防止异常冒泡到页面级别。
至于记录异常,就个人而言,我会在两个层中记录错误--Business逻辑层和表示层。
答案 1 :(得分:0)
如果自动调用业务逻辑层中的方法,我会使用这些事件。
我认为这些事件的目的是:以某种自定义方式显示错误。
但我不会自动调用逻辑层中的方法。相反,我将通过代码调用它们,并返回一个布尔值,指示操作是否成功。
插入/更新Person时的类似内容:
if (Person.Save(data)) {
// show OK message
} else {
// show error message
}
其中Person是相对于Person Data Access Layer类的BAL类。
希望得到这个帮助。