C# 应用程序_错误()未触发

C# 应用程序_错误()未触发,c#,asp.net,logging,C#,Asp.net,Logging,我正在尝试运行一个ASP.NET应用程序,该应用程序将异常记录到数据库中。我正在使用Application\u Error捕获异常 在添加连接字符串之前,为了测试我的代码(Logger类和Global.asax中的代码),我尝试将错误记录到windows事件查看器中。这正如预期的那样有效 但是在将连接字符串添加到Web.config文件并添加ADO.NET代码之后,我尝试运行该应用程序。但我得到了死亡的黄屏:D 我不知道我的代码出了什么问题。我只修改了Web.config文件中的Connecti

我正在尝试运行一个ASP.NET应用程序,该应用程序将异常记录到数据库中。我正在使用Application\u Error捕获异常

在添加连接字符串之前,为了测试我的代码(Logger类和Global.asax中的代码),我尝试将错误记录到windows事件查看器中。这正如预期的那样有效

但是在将连接字符串添加到Web.config文件并添加ADO.NET代码之后,我尝试运行该应用程序。但我得到了死亡的黄屏:D

我不知道我的代码出了什么问题。我只修改了Web.config文件中的ConnectionString元素,并添加了ADO.NET代码

这是代码

这是页面加载事件中的web表单代码。Countries.xml文件不存在,预计会引发错误

DataSet dataset = new DataSet();
dataset.ReadXml(Server.MapPath("~/Countries.xml"));
GridView1.DataSource = dataset;
GridView1.DataBind();
应用程序错误

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>


您是否在web.config上启用了自定义错误

<system.web>
    ...
    <customErrors mode="RemoteOnly" defaultRedirect="~/Errors.aspx" redirectMode="ResponseRewrite" />
    ...
</system.web>
更新:

罪魁祸首可能是在Global.asax上注册为筛选器的HandlerErrorAttribute

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute()); // this line is the culprit
}
只需注释掉或删除该行,并确保您已经在web.config下的system.web中实现了customErrors

我对HandleErrorAttribute不太熟悉,如果这解决了您的问题,那么不妨查看它的文档。

如果您在调试时有
,代码将不会到达
应用程序错误事件,因为异常会立即显示在浏览器中

如果要在调试时达到应用程序错误,请启用自定义错误-

<customErrors mode="On" defaultRedirect="~/Error.aspx" />

在我的例子中,我在这个事件处理程序中记录了错误日志(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>


您是否也实现了自定义错误页面?您是否已验证没有其他try-catch语句可能在应用程序错误代码之前首先捕获异常?您好@Ephraim,是的,我正在实现一个自定义错误页:Errors.aspx。我的代码中没有其他try-catch块。异常没有得到处理,我看到了死亡的黄屏。嗨@Ephraim,你的方法会奏效,这将帮助我抓住异常。但是我的问题是,我使用的代码和方法有什么问题。如果未使用try-catch块或在页面级别处理异常,则应触发应用程序_错误。那为什么不起作用呢?@Nachiket我更新了我的答案。应用程序错误的方法签名可能在某个地方不正确。我发布了一个示例。不,方法签名是相同的。我试过你的密码。但这种控制不能达到应用误差法。我甚至将customErrors模式的值从remoteOnly更改为on,但仍然没有更改。我的意思是我被引导到Errors.aspx页面,但是应用程序_错误没有被触发。@Nachiket我已经更新了我的答案,看看它是否适合你。嗨@Ephraim我的代码中没有这个方法。这是我代码的链接。如果您能仔细阅读代码,就更容易识别错误。[链接]嗨@Win,我试过了。但控制永远达不到应用误差法。虽然我确实被重定向到Errors.aspx pageyep,但应用程序出错到底是为了什么
<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>