可以按需生成ASP.NET黄色死亡屏幕(YSOD)吗?

时间:2009-05-18 16:44:30

标签: asp.net error-reporting error-logging yellow-screen-of-death

我们想从Global.asax错误处理程序中捕获YSOD输出以用于错误报告电子邮件。有没有办法利用内置的ysod生成器?

6 个答案:

答案 0 :(得分:9)

我会调查ELMAH (Error Logging Modules and Handlers for ASP.NET)

  

ELMAH(错误记录模块和   处理程序)是一个应用程序范围的错误   完全记录设施   可插拔。它可以动态添加   到正在运行的ASP.NET Web应用程序,   甚至所有ASP.NET Web应用程序   在一台机器上,没有任何需要   重新编译或重新部署。

     

一旦ELMAH被放入了   运行Web应用程序并进行配置   适当地,你得到以下   设施没有改变单一   你的代码行:

     
      
  • 记录几乎所有未处理的例外情况。
  •   
  • 远程查看已重新编码的例外日志的网页。
  •   
  • 用于远程查看任何已记录内容的完整详细信息的网页   异常。
  •   
  • 在许多情况下,您可以查看死亡的原始黄色屏幕   ASP.NET为给定生成的   异常,即使使用customErrors模式   关掉了。
  •   
  • 发生时每个错误的电子邮件通知。
  •   
  • 日志中最近15个错误的RSS提要。
  •   

答案 1 :(得分:8)

是的,有一种方法可以做到这一点。

在global.asax文件的Application_Error事件中,将最后一个异常作为System.HttpUnhandledException获取。您的代码将如下所示:

var lastException = Server.GetLastError() as HttpUnhandledException;
string Ysod = lastException.GetHtmlErrorMessage();
// your call to emailing routine follows

我同意其他人的意见。您也可以使用ELMAH执行此操作。

答案 2 :(得分:3)

你听说过ELMAH吗?它可能会为您提供您真正想要的所有功能......

这是一篇博文,解释了一下:http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

答案 3 :(得分:2)

您应该查看ELMAH它会自动执行您所要求的内容。

答案 4 :(得分:2)

我会说,一般来说,您不希望用户体验YSOD。这是我之前在Web应用程序中捕获错误然后为用户提供更优雅的错误页面...

protected void Application_Error(object sender, EventArgs e)
{
    MailMessage msg = new MailMessage();
    HttpContext ctx = HttpContext.Current;

    msg.To.Add(new MailAddress("me@me.com"));
    msg.From = new MailAddress("from@me.com");
    msg.Subject = "My app had an issue...";
    msg.Priority = MailPriority.High;

    StringBuilder sb = new StringBuilder();
    sb.Append(ctx.Request.Url.ToString() + System.Environment.NewLine);
    sb.Append("Source:" + System.Environment.NewLine + ctx.Server.GetLastError().Source.ToString());
    sb.Append("Message:" + System.Environment.NewLine + ctx.Server.GetLastError().Message.ToString());
    sb.Append("Stack Trace:" + System.Environment.NewLine + ctx.Server.GetLastError().StackTrace.ToString());
    msg.Body = sb.ToString();

    //CONFIGURE SMTP OBJECT
    SmtpClient smtp = new SmtpClient("myhost");

    //SEND EMAIL
    smtp.Send(msg);

    //REDIRECT USER TO ERROR PAGE
    Server.Transfer("~/ErrorPage.aspx");
}

答案 5 :(得分:1)

只要应用程序中发生未处理的异常,就会触发Global.asax文件中的Application_Error事件。您可以使用Server.GetLastError()方法获取最后发生的异常。

同样,您可以通过在web.config文件的customErrors部分下的web.config中指定它来创建自己的自定义错误页面。通过指定默认文件,您可以在路由异常时执行任何自定义编码。