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