我们处理这个问题的方法如下:
UI / codebehind 层级中通往其他层级的所有调用都使用 try-catch,其中我们始终捕获自定义异常。底层执行的所有操作都有自己的 try-catch,会记录、包装并抛出自定义异常。然后 UI 可以依赖此功能,并寻找带有友好错误消息的已处理异常。
Codebehind:
protected void btnSubmit_Click(object sender, EventArgs e)
{
try
{
MyBL.TakeAction()
}
catch(MyApplicationCustomException ex)
{
ltlErrorPane.Text = ex.Message;
if(ex.ErrorType == MyCustomErrorsType.Transactional)
{
Response.Redirect("~/Errors/Transaction.aspx");
}
}
}
业务层:
在业务层中,任何可能失败的操作都会使用try-catch块进行处理,该块会在将问题抛到用户界面之前记录并封装问题。
public class MyBL
{
public static void TakeAction()
{
try
{
}
catch(SpecificDotNetException ex)
{
MyExceptionManagement.LogException(ex)
throw new MyApplicationCustomException(ex, "Some friendly error message", MyCustomErrorsType.Transactional);
}
finally
{
}
}
}
异常处理程序:
实际的异常处理程序有多种记录方式,包括事件日志、文件日志和最后一项是电子邮件(如果其他方法都无法使用)。我们选择在记录器无法执行任何预期操作时简单地返回 false。尽管这是个人选择,但我们认为三种方法依次失败的可能性非常小(事件日志失败,尝试文件日志,失败,尝试电子邮件,失败)。在这种情况下,我们选择允许应用程序继续运行。另一个选项是允许应用程序完全失败。
public static class MyExceptionManagement
{
public static bool LogException(Exception ex)
{
try
{
return true;
}
catch(Exception ex)
{
return false;
}
}
}
最后,作为一种应急措施,我们还在Global.asax
中实现了Application_Error
全局事件处理程序。当我们没有正确地try-catch某些内容时,这是最后的手段。一般情况下,我们会记录并重定向到友好的错误页面。如果以上自定义错误处理成功完成,很少有错误会到达全局处理程序。
希望这可能对您有所帮助。这是一个可能的解决方案。在一些较大的应用程序上,它已经成功运行了几年。