【问题标题】:Unhandled Exceptions with Global.asaxGlobal.asax 的未处理异常
【发布时间】:2010-10-09 17:03:43
【问题描述】:

我正在通过电子邮件从 global.asax 发送未处理的异常详细信息。如何获取未处理异常的 aspx 文件或程序集文件的路径和/或文件名。

当我在开发和测试时,此信息显示在异常的堆栈跟踪中。当我将 global.asax 部署到生产环境时,此信息不再显示在堆栈跟踪中。

当我在 Global.asax 中构建 MailMessage 对象时,有没有办法获取此信息?

谢谢

【问题讨论】:

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


    【解决方案1】:

    在 Visual Studio 中,您需要设置发布版本以生成调试符号。与调试版本不同,默认情况下未设置。这将为您提供完整的异常堆栈跟踪。

    即便如此,由 JIT 编译器完成的优化(例如内联)可能意味着您无法在堆栈跟踪中获得正确的行号。如果您想确定行号,还可以将发布版本设置为“无优化”。但这可能意味着您的应用的性能和/或吞吐量较低(后者在网络应用中往往更为重要)。

    编辑:您可以通过转到“解决方案资源管理器”窗口、右键单击项目并选择“属性”菜单项来找到“生成调试符号”设置。然后转到配置属性 > 构建 > 生成调试信息并设置为 true 或 false。优化代码设置在同一窗口中。

    【讨论】:

      【解决方案2】:

      如果这是标签所暗示的 ASP.NET 应用程序,您应该能够执行类似的操作... ctx.Request.Url.ToString() 将为您提供文件所在位置的文件名发生错误。

      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");
      }
      

      【讨论】:

      • HttpContext.Current.Url 为您提供当前 URL。但问题要求提供程序集的路径和/或文件名。
      • @RoadWarrior:因为它是一个 ASP.NET 应用程序,所以 URL 很可能已经足够好了。既然他接受了答案,我猜这符合他的需求。
      • 还要注意错误不在发送电子邮件中...可能希望将整个内容包装在 try/catch 块中
      猜你喜欢
      • 2012-05-20
      • 2012-09-17
      • 2014-05-11
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      相关资源
      最近更新 更多