我试图运行一个将异常记录到数据库的ASP.NET应用程序。我使用Application_Error来捕获异常。
在添加连接字符串之前,为了测试我的代码(Logger类和Global.asax中的代码),我尝试将错误记录到windows事件查看器。这可以按预期工作。
但是在将连接字符串添加到Web.config文件并添加ADO.NET代码之后,我尝试运行该应用程序。但是我得到了死亡的黄色屏幕:D
我不知道我的代码有什么问题。我只修改了Web.config文件中的connectionStrings元素,并添加了ADO.NET代码。
这是代码。
这是Page_Load事件中的Web表单代码。 Countries.xml文件不存在,预计会抛出错误。
DataSet dataset = new DataSet();
dataset.ReadXml(Server.MapPath("~/Countries.xml"));
GridView1.DataSource = dataset;
GridView1.DataBind();
的Application_Error
Exception exception = Server.GetLastError();
if (exception != null)
{
Logger.Log(exception);
Server.ClearError();
Server.Transfer("~/Errors.aspx");
}
的Web.config
<configuration>
<connectionStrings>
<add name="DBCS" connectionString="Data Source=.;database=Sample;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
</system.web>
</configuration>
我尝试通过在Global.asax中的Application_Error方法放置断点来进行调试,但控件永远不会到达那一点。 从Page_Load事件触发异常。 Logger类代码中没有编译错误。 另外,我不想使用customErrors路由来解决这个问题。
提前致谢。
这是代码的链接: https://drive.google.com/folderview?id=0B5K22Q9r50wXU0VOQmJKVHBoaDg&usp=sharing
答案 0 :(得分:2)
如果您在 调试 时有TypeError: Cannot read property 'profile' of undefined
,则代码将无法访问<customErrors mode="Off" />
事件,因为浏览器内部会立即显示异常。
如果要在调试时访问Application_Error,则需要启用自定义错误 -
Application_Error
答案 1 :(得分:0)
您是否在web.config上启用了自定义错误?
<system.web>
...
<customErrors mode="RemoteOnly" defaultRedirect="~/Errors.aspx" redirectMode="ResponseRewrite" />
...
</system.web>
请注意,重定向模式为“ResponseRewrite”。为了保留Server.GetLastError()
例外。如果你另外设置,那么Server.GetLastError()
将返回null。
在Global.asax
中实现Application_Error应该很容易protected void Application_Error(Object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is ThreadAbortException)
return; // Redirects may cause this exception..
Logger.Error(LoggerType.Global, ex, "Exception");
Response.Redirect("unexpectederror.htm");
}
更新:
可能的罪魁祸首是在Global.asax上注册为过滤器的HandlerErrorAttribute。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); // this line is the culprit
}
只需注释掉或删除该行,并确保已在web.config下的system.web中实现了customErrors。
我对HandleErrorAttribute并不熟悉,如果这可以解决您的问题,那么也可以查看其文档。
答案 2 :(得分:0)
在我的情况下,我在此事件处理程序中记录了错误日志(sentry.io),并且日志记录算法本身导致了错误,因此重定向到了web.config内部定义的错误页面,我也认为它没有触发。确保也对错误处理程序中的代码使用try-catch以便调试案例。就是刷新异常详细信息作为响应并结束响应。
这是我对sentry.io的错误记录器:
public static void LogException(Exception ex, bool redirect = true)
{
if (ex != null)
{
if (HttpContext.Current.Request.IsLocal)
{
throw ex;
}
// ignore Response.Redirect errors
if (ex.GetType() == typeof(ThreadAbortException))
{
return;
}
var sentryApiKey = GetAppSetting("SentryIO.ApiKey");
if (string.IsNullOrEmpty(sentryApiKey))
{
throw new NullReferenceException("SentryIO.ApiKey not defined as app setting.");
}
var ravenClient = new RavenClient(sentryApiKey);
ravenClient.Capture(new SentryEvent(ex));
if (redirect)
{
HttpContext.Current.Response.StatusCode = 404;
HttpContext.Current.Response.Redirect("/?500-error-logged");
}
}
}
正如我所见,在发布模式下进行构建或具有如下所示的web.config并不能阻止此事件的触发。
<compilation debug="false" targetFramework="4.5.2" />
<customErrors mode="RemoteOnly" defaultRedirect="errordocs/500.htm">
<error statusCode="403" redirect="errordocs/403.htm" />
<error statusCode="404" redirect="errordocs/404.htm" />
</customErrors>