Joh*_*Doe 3 .net c# asp.net error-handling webforms
我有一个 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然而大多数时候这不会被调用。我只是看到屏幕上显示错误消息(就像美化的警报)。
或者,如果调用此方法,则 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>
Run Code Online (Sandbox Code Playgroud)
最终目标是将用户重定向到页面(或者可能只是很好地显示错误),同时将其记录到文件中或将错误写入数据库。
void Application_Error(object sender, EventArgs e)当服务器处理页面(请求 .aspx、.ashx 资源)时,主线程中发生的异常将被调用。
在两种情况下它不会被调用:
StackOverflowException或OutOfMemoryException因此,对于 WCF、WebServices,将所有入口点包装在
try {}
catch(Exception e) {
Logger.Log(e);
throw;
}
Run Code Online (Sandbox Code Playgroud)
声明(请注意,如果您有很多这样的声明,请将时间投入到更通用的解决方案上)。
另请注意 - 如果您的错误页面上有错误,您将看到黄屏死机(显然)。所以我更喜欢将静态 html 页面显示为错误页面(出现问题的可能性最低)。
在您的错误处理代码中,您没有清理错误状态,我也更喜欢Redirect进行Server.Transfer错误处理。最终剪裁看起来像:
var ex = Server.GetLastError();
Logger.Log(ex);
Server.ClearError();
Response.Redirect("/error.aspx");
Run Code Online (Sandbox Code Playgroud)
最后一点 - 不需要自己进行错误日志记录(好的程序员都是懒惰的 - 就“不要重新发明轮子而言)” - 有很多很棒的日志记录模块,例如 Elmah、Microsoft Enterprise Library 或 log4net。
| 归档时间: |
|
| 查看次数: |
5731 次 |
| 最近记录: |