Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET错误处理问题_C#_Asp.net - Fatal编程技术网

C# ASP.NET错误处理问题

C# ASP.NET错误处理问题,c#,asp.net,C#,Asp.net,我是ASP.NET的新手,我有一个非常基本的网站,我只想抓取所有应用程序错误并通过电子邮件发送给我,同时给用户一个错误页面。关于这个问题我读了很多书,似乎有很多信息。下面是我想到的,但我在会话中保留异常时遇到问题,因此我可以通过电子邮件将其发送给我 我一直收到一个NullReferenceException,该异常未被Error.aspx.cs文件中ex.消息上的用户代码处理 有什么想法吗 Global.asax.cs- void Application_Error(object sender,

我是ASP.NET的新手,我有一个非常基本的网站,我只想抓取所有应用程序错误并通过电子邮件发送给我,同时给用户一个错误页面。关于这个问题我读了很多书,似乎有很多信息。下面是我想到的,但我在会话中保留异常时遇到问题,因此我可以通过电子邮件将其发送给我

我一直收到一个NullReferenceException,该异常未被Error.aspx.cs文件中ex.消息上的用户代码处理

有什么想法吗

Global.asax.cs-

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    HttpContext.Current.Response.Redirect("~/Error.aspx");
}
Error.aspx.cs-

public partial class Error : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Exception ex = (Exception)Session["Exception"];
            this.SendEmail(ex);
            Session.Remove("Exception");
        }
    }

    private void SendEmail(Exception ex)
    {
        string body = "An exception occured at "
                    + DateTime.Now.ToLongTimeString()
                    + " on " + DateTime.Now.ToLongDateString()
                    + "<br />" + ex.Message; //ERROR HERE
        MailMessage msg = new MailMessage("from@email.com", "to@email.com");
        msg.Subject = "Exception in Portal Website";
        msg.Body = body;
        msg.IsBodyHtml = true;
        SmtpClient client = new SmtpClient("localhost");
        client.Send(msg);
    }
}

我没有看到您将异常对象推送到会话,为什么不将SendEmail方法移动到global.ascx,然后将SendEmail重定向到错误页面。有像这样的第三方插件可以通过简单的配置轻松地为您完成这一切

我看不到您将异常对象推送到会话,为什么不将SendEmail方法移动到global.ascx,然后将SendEmail用户重定向到错误页面。有像这样的第三方插件可以通过简单的配置轻松地为您完成这一切

我在一个类似的实例中所做的是抛出所有异常,然后在您的global.asax中使用Application\u Error方法来执行您需要处理错误消息的任何工作

  void Application_Error(object sender, EventArgs e) 
    {
        // Code that runs when an unhandled error occurs
        string exception;
            Exception ex = Server.GetLastError();
            if (ex.InnerException != null)
            {
                Exception innerException = ex.InnerException;
                exception = ex.InnerException.Message;
            }
            else
            {
                exception = ex.Message;
            }

        //Send email here       

            //redirect to error page


    }

我在一个类似的实例中所做的是抛出所有异常,然后在您的global.asax中使用Application_Error方法来执行您需要处理错误消息的任何工作

  void Application_Error(object sender, EventArgs e) 
    {
        // Code that runs when an unhandled error occurs
        string exception;
            Exception ex = Server.GetLastError();
            if (ex.InnerException != null)
            {
                Exception innerException = ex.InnerException;
                exception = ex.InnerException.Message;
            }
            else
            {
                exception = ex.Message;
            }

        //Send email here       

            //redirect to error page


    }

您的问题是,您从未设置会话[Exception],因此在Error.aspx上,Exception ex始终为null。。。然后执行ex.Message将抛出NullReferenceException。即使您解决了这个问题并适当地设置了会话[异常],您所做的也并不理想

您可以通过应用程序错误功能发送电子邮件

您的Response.Redirect将导致另一个异常ThreadAbortException

你应该看看实现。它很容易实现,并且可以做您想做的一切


但是,如果您只想修复代码,只需将发送电子邮件逻辑移到应用程序错误,那么您就不必担心会话。

您的问题是您从未设置会话[异常],因此在您的Error.aspx中,异常ex总是为空。。。然后执行ex.Message将抛出NullReferenceException。即使您解决了这个问题并适当地设置了会话[异常],您所做的也并不理想

您可以通过应用程序错误功能发送电子邮件

您的Response.Redirect将导致另一个异常ThreadAbortException

你应该看看实现。它很容易实现,并且可以做您想做的一切


但是,如果您只想修复代码,只需将发送电子邮件逻辑移到应用程序错误,您就不必担心会话问题。

我也遇到了类似的问题。我要去看看ELMAH,但是我的项目对开源项目有很大的限制,你的可能会。做我真糟糕

在这种情况下,我建议为您可以直接从Global.asax调用的消息创建一个日志函数。比如:

 void Application_Error(object sender, EventArgs e)
 {
      Exception ex = Server.GetLastError();
      LogException(ex);
      HttpContext.Current.Response.Redirect("~/Error.aspx");
 }

 //Somewhere Else
 void LogException(Exception ex)
 {
      WriteExceptionToEndOfTextFile(ex);
      SendEmail();
 }

这样,如果有人决定要抑制我们的异常,他们仍然可以正确处理异常。

我也处于类似的困境。我要去看看ELMAH,但是我的项目对开源项目有很大的限制,你的可能会。做我真糟糕

在这种情况下,我建议为您可以直接从Global.asax调用的消息创建一个日志函数。比如:

 void Application_Error(object sender, EventArgs e)
 {
      Exception ex = Server.GetLastError();
      LogException(ex);
      HttpContext.Current.Response.Redirect("~/Error.aspx");
 }

 //Somewhere Else
 void LogException(Exception ex)
 {
      WriteExceptionToEndOfTextFile(ex);
      SendEmail();
 }

这样,如果有人决定要抑制我们的异常,他们仍然可以正确处理异常。

谢谢Mike,我将进一步研究ELMAH,我不确定实现它需要什么。我只是想用一些简单的东西,看看它是如何工作的。我会将我的电子邮件逻辑移到应用程序错误,看看它是如何工作的。我使用了一些类似于您多年来所做的事情,所以它没有任何问题。虽然可以在几分钟内安装ELMAH,但它有一些很好的功能。@Zach但我认为您需要做的只是在Visual Studio软件包管理器控制台中,运行安装软件包ELMAH,ELMAH将在内存中记录错误,我相信。。。需要轻微按摩才能将其放入DB。谢谢Mike,我会更多地了解ELMAH,我不确定实施它需要什么。我只是想用一些简单的东西,看看它是如何工作的。我会将我的电子邮件逻辑移到应用程序错误,看看它是如何工作的。我使用了一些类似于您多年来所做的事情,所以它没有任何问题。虽然可以在几分钟内安装ELMAH,但它有一些很好的功能。@Zach但我认为您需要做的只是在Visual Studio软件包管理器控制台中,运行安装软件包ELMAH,ELMAH将在内存中记录错误,我相信。。。需要轻微按摩才能将其置于DB中。