我有一个构建为的Web窗体(.NET 4.0)Web应用程序:
我正在尝试遵循一些有关错误处理的教程,但到目前为止,我得到的结果不一致。
我的问题是我应该如何处理应用程序中的错误?
我应该在try / catch中包装所有方法吗?
我是否应该仅使用try / catch将方法包装在业务层中?
如何使用WCF Ajax方法处理PortalLayer中发生的错误?
例如,我将以下内容添加到了Global.asax文件中:
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
Exception exc = Server.GetLastError();
if (exc is HttpUnhandledException)
{
if (exc.InnerException != null)
{
exc = new Exception(exc.InnerException.Message);
Server.Transfer(@"\Pages\Error.aspx?handler=Application_Error%20-%20Global.asax", true);
}
}
}
但是,大多数情况下不会被调用。我只是看到错误,在屏幕上显示一条错误消息(就像光荣的警报一样)。
或者,如果调用此方法,则exc不是HttpUnhandledException,因此传输永远不会发生。
我也在web.config中尝试了此操作,但是我看不到它有任何作用。(如果我注释掉,我得到的结果相同)
<customErrors mode="On" defaultRedirect="Error.aspx?handler=customErrors%20section%20-%20Web.config">
<error statusCode="404" redirect="ErrorPage.aspx?msg=404&handler=customErrors%20section%20-%20Web.config"/>
</customErrors>
最终目标是将用户重定向到页面(或者可能只是很好地显示错误),同时将其登录到文件中或将错误写到数据库中。
在void Application_Error(object sender, EventArgs e)
将调用在主线程中发生,当服务器处理页面(要求为.aspx,.ashx的资源)例外。
在以下两种情况下不会调用它:
StackOverflowException
或OutOfMemoryException
因此,对于WCF,WebServices,将所有入口点包装在
try {}
catch(Exception e) {
Logger.Log(e);
throw;
}
声明(请注意,如果有很多,请花时间在更通用的解决方案上)。
另请注意-如果您的错误页面上有错误,您将看到黄色的死亡屏幕(显然)。因此,我更喜欢将静态html页面显示为错误页面(发生问题的可能性最低)。
在您的错误处理代码你不清理错误状态,我也宁愿Redirect
到Server.Transfer
错误处理。最终的片段看起来像:
var ex = Server.GetLastError();
Logger.Log(ex);
Server.ClearError();
Response.Redirect("/error.aspx");
最后说明-无需自己进行错误日志记录(优秀的程序员很懒惰-就“不要重新发明轮子”而言)-有很多很棒的日志记录模块,例如Elmah,Microsoft Enterprise Library或log4net。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句