在ASP.NET中使用企业库异常处理应用程序块 - 代码审查

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),但我想知道是否有人发现此实现存在重大问题.

Ran*_*ica 5

我看到一些问题:

  • 您可能希望在错误处理程序中处理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吗?