我应该抛出Global.asax中的Application_Error处理程序中发生的异常吗?

时间:2013-02-22 06:27:31

标签: c# asp.net exception-handling global-asax

aspx.cs中未处理的错误代码将被global.asax中的Application_Error处理程序捕获 我在Application_Error处理程序中编写了一些代码来记录aspx.cs中发生的未处理错误 但是如果日志代码本身也失败并产生异常(可能是由于I / O或文件系统问题) 我应该抛出这样的例外吗? 如果我扔掉它,哪个事件应该收到这样的例外?
或者,如果我写“throw”语法,它没有任何区别? 代码示例如下

protected void Application_Error(object sender, EventArgs e)
{
    try
    {
        // my codes to log exception to Database System here....
    }
    catch(Exception)
    {
        throw;  //Should I write "throw" syntax here ? 
    }
}

2 个答案:

答案 0 :(得分:5)

Application_Error是最后一个可以记录在线程(当前正在为您的请求提供服务)中止之前发生的异常的地方。

你不需要抛出任何异常,因为它会在函数退出后自动执行。

这是一个合理的implementation

我认为您最关心的是如果您的故障转移机制失败该怎么办。在这种情况下,这是您的日志记录。这在计算机中是一个更大的问题,但构建链式故障转移机制通常是浪费时间,因为最终可能失败(对自己的研究提出一些建议:尽量保持一切尽可能无状态) 。您最好的选择是拥有一个非常可靠的记录机制作为您的最后手段,99.9%的成功将成功。不打算如何创建这样的机制(并且自己做这个并不是一个好主意 - 无论如何都要创建自己的记录器,因为有很多技巧可以确保您的日志记录足够高并且非突兀)但总的来说,我建议你使用elmah,它可能是目前最好的日志记录框架&它将满足您的目的。

对于可能获得的极少量错误(在现实生活中他们可能不会这样做)我不会失去他们的睡眠。

答案 1 :(得分:0)

  • 您想在登录后抛出Server.GetLastException()吗?这取决于该例外的性质和原因。我会在特殊的地方或弹出窗口中显示它
  • 如果尝试记录该异常时抛出异常?绝对你可能想要吞下它