我想创建一个自定义错误页面来处理所有未处理的异常。
我想从位于Global.asax.cs的Application_Error(object sender, EventArgs e)
方法重定向到它。如何在其中显示引发应用程序错误的异常中的一些详细信息?
答案 0 :(得分:3)
我做了你正在谈论的同样的事情。我创建了一个向用户显示信息的ErrorPage。我还创建了一个将错误信息写入事件日志...
的函数对于页面,这就是我正在做的事情。只需将标签贴在某处......
protected void Page_Load(object sender, EventArgs e)
{
Exception ex = Server.GetLastError().GetBaseException();
this.lblMessage.Text = ex.Message;
this.lblSource.Text = ex.Source;
this.lblStackTrace.Text = ex.StackTrace;
if (AppProperties.AppEnv != AppEnvironment.PROD)
{
this.ErrorDetails.Visible = true;
}
else
{
this.ErrorDetails.Visible = false;
}
Utility.LogError();
Server.ClearError();
}
这就是LogError函数的样子......
public static void LogError()
{
LogError(HttpContext.Current.Server.GetLastError().GetBaseException());
}
public static void LogError(Exception ex)
{
EventLog log = new EventLog();
if (ex != null)
{
log.Source = ConfigurationManager.AppSettings["EventLog"].ToString();
StringBuilder sErrorMessage = new StringBuilder();
if (HttpContext.Current.Request != null && HttpContext.Current.Request.Url != null)
{
sErrorMessage.Append(HttpContext.Current.Request.Url.ToString() + System.Environment.NewLine);
}
sErrorMessage.Append(ex.ToString());
log.WriteEntry(sErrorMessage.ToString(), EventLogEntryType.Error);
}
}
答案 1 :(得分:1)
您可以从Server.GetLastError()获取最后一个异常。一旦处理完错误,您可以通过调用Server.ClearError()来清除它。
顺便说一下,向最终用户展示太多可能被证明是一个安全漏洞被认为是不好的做法。另外,请注意,如果您重定向而不是返回500 HTTP错误代码,则各种机器人不会意识到它们会导致崩溃并继续在您的站点上运行相同的损坏请求。所以一定要使用Server.Transfer()而不是Response.Redirect()并设置Response.StatusCode = 500。
答案 2 :(得分:0)
您可以使用Server.GetLastError()来获取应用程序抛出的异常。
答案 3 :(得分:0)
在您的信息页中,执行以下操作:
ErrorLabel.Text = Server.GetLastError();
这假定是C#。然后,您可以从global.asax文件ApplicationError事件重定向。还有其他处理方法,我不建议使用异常消息来显示用户。
答案 4 :(得分:-1)
向最终用户显示详细的错误信息几乎总是一个坏主意。您最终可能会暴露各种不合适的信息:文件名,数据库凭据,实现细节等。将异常记录到安全的地方(日志文件,数据库等),但不要将其显示给用户。