2016-07-10 99 views
8

我试图运行一个将异常记录到数据库的ASP.NET应用程序。我正在使用Application_Error来捕获异常。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事件触发的。 记录器类代码中没有编译错误。 此外,我不想使用customErrors路线来解决这个问题。

在此先感谢。

这是链接到代码: https://drive.google.com/folderview?id=0B5K22Q9r50wXU0VOQmJKVHBoaDg&usp=sharing

+0

你实现自定义错误页吗?您是否已验证您没有其他try-catch语句可能在您的Application_Error代码之前首先发现异常? –

+0

嗨@Ephraim,是的,我正在实现一个自定义错误页面:Errors.aspx。我的代码中没有其他try catch块。这个例外没有得到处理,我看到了死亡的黄色屏幕。 – Nachiket

回答

0

是否启用自定义错误的web.config文件?

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

注意重定向模式是,为了保持Server.GetLastError()异常“ResponseRewrite”。如果你设置这个,否则Server.GetLastError()将返回null。

实施的Application_Error应该很容易。在Global.asax中

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

UPDATE:

,罪魁祸首可能是注册为在Global.asax过滤器HandlerErrorAttribute。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); // this line is the culprit 
} 

只需注释掉或删除该行,并确保已在web.config下的system.web中实现了customErrors。

我不熟悉HandleErrorAttribute,如果这可以解决您的问题,那么也可以查看它的文档。

+0

嗨@Ephraim,你的方法将工作,这将帮助我赶上例外。但是,我使用的代码和方法有什么问题,是我的问题。如果未使用try-catch块或页面级别处理异常,Application_Error应该被触发。那为什么这不起作用? – Nachiket

+0

@Nachiket我更新了我的答案。可能您的Application_Error方法签名在某处不正确。我发布了一个例子。 –

+0

不是方法签名是相同的。我试过你的代码。但是控件不会达到Application_Error方法。我甚至将customErrors模式的值从remoteOnly更改为on,但仍然没有改变。我的意思是我被定向到Errors.aspx页面,但是Application_Error没有被触发。 – Nachiket

1

如果你有<customErrors mode="Off" />调试,因为浏览器内显示的时候了异常的代码将无法达到Application_Error事件。

如果你想达到的Application_Error在调试时,要启用自定义错误 -

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

嗨@Win,我试过了。但是控件永远不会到达Application_Error方法。虽然我确实被重定向到Errors.aspx页面 – Nachiket

+1

,但是到底是什么是Application_Error – Toolkit