Joh*_*soe 2 asp.net enterprise-library exception-handling
我正在构建的ASP.NET应用程序中实现企业库异常处理应用程序块.我打算通过在Global.asax.cs中放置以下代码来处理未捕获的应用程序异常:
protected void Application_Error()
{
Exception error = Server.GetLastError();
Exception errorToThrow;
if (ExceptionPolicy.HandleException(error, "Application Error", out errorToThrow))
{
if (errorToThrow != null)
throw errorToThrow;
}
else
Server.ClearError();
}
Run Code Online (Sandbox Code Playgroud)
我相信这将有助于处理策略的各种后处理操作(None,NotifyRethrow,ThrowNewException),但我想知道是否有人发现此实现存在重大问题.
我看到一些问题:
您可能希望在错误处理程序中处理HttpUnhandledException.这就是您的页面引发的大多数异常.
我没有看到调用Server.ClearError()的句柄和恢复(PostHandlingAction = None)策略的值.基本上你的页面抛出异常而你什么都不做.在最佳情况下,用户会看到一个空白页面.最糟糕的情况是,您可能会有一个部分呈现的页面,但没有指示发生了什么.
我也没有看到可能从您的错误处理程序中抛出异常.您要么最终得到死亡的黄色屏幕,要么强制要求调用另一个错误页面(例如,在web.config中定义的customErrors重定向).
您的HandleException逻辑不考虑NotifyRethrow场景. (根据注释存在customError重定向删除).
使用@ vladhorby的ErrorPage并保持你的主逻辑将给出这样的东西:
protected void Application_Error()
{
Exception error = Server.GetLastError();
if (error is HttpUnhandledException)
{
error = error.InnerException;
}
Exception errorToThrow;
if (ExceptionPolicy.HandleException(error, "Application Error", out errorToThrow))
{
Response.Redirect(string.Format("ErrorPage.aspx?Message={0}", Uri.EscapeDataString((errorToThrow ?? error).Message)));
}
else
{
Server.ClearError();
}
}
Run Code Online (Sandbox Code Playgroud)
关于上述代码的一些注意事项:
如果ErrorPage.aspx由于某种原因抛出异常,你可能会在无限循环中结束,所以请确保ErrorPage.aspx有自己的Page_Error来尝试避免未处理的异常传播到全局错误处理程序.
它没有考虑异议2和3. :)
我不确定你的情况和要求,但你考虑过使用ELMAH吗?