如何从异常中获取更多细节?

问题描述:

我有一个.NET 4.0 Web应用程序,它在Global.asax的Application_Error事件中实现了一个错误处理程序。如何从异常中获取更多细节?

发生异常时此拦截,并派我在内的各种类的登录用户,页面信息上发生错误的电子邮件,会议内容等

这是所有伟大的,但有一些基本的细节丢失,我似乎无法找到。

举例来说,这是一个错误的一个子集,我会收到和相关的堆栈跟踪:

Source: Telerik.Web.UI 

Message: Selection out of range 

Parameter name: value 

Stack trace: at Telerik.Web.UI.RadComboBox.PerformDataBinding(IEnumerable dataSource) 
    at Telerik.Web.UI.RadComboBox.OnDataSourceViewSelectCallback(IEnumerable data) 
    at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) 
    at Telerik.Web.UI.RadComboBox.OnDataBinding(EventArgs e) 
    at Telerik.Web.UI.RadComboBox.PerformSelect() 
    at System.Web.UI.WebControls.BaseDataBoundControl.DataBind() 
    at Telerik.Web.UI.RadComboBox.DataBind() 
    at System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() 
    at Telerik.Web.UI.RadComboBox.OnPreRender(EventArgs e) 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

现在一样可爱,因为这是我可以知道一个做)控制和B的名称)导致控制超出范围的值。

有关我如何获得此类信息的任何建议?我已经在调试模式下运行这个,并且传递给Global.asax的对象似乎没有包含我可以看到的更多细节。

+0

您需要在发生异常的地方捕捉异常,并从那里登录以获取您要查找的信息。 – 2012-03-19 17:59:44

+0

您是否尝试重写['MasterPage.OnError(EventArge)'](http://msdn.microsoft.com/zh-cn/library/system.web.ui.templatecontrol.onerror.aspx)? – abatishchev 2012-03-19 18:00:57

+0

您如何获取已显示的数据?这个例外是不是包含你想要的信息?如果是这样,你可能会运气不好,除非你能够添加更多的数据到抛出的异常... – Chris 2012-03-19 18:01:29

随您的装配一起运送您的PDB。通过这种方式,您将在异常堆栈跟踪中获取行号和源代码文件名。一旦你有行号,你就知道你在那行上写了什么代码。

+0

我上面发布的错误是所有调试选项打开并在IDE内运行 – cusimar9 2012-03-20 08:38:23

+0

@ cusimar9,您显示的错误在某个Telerik组件内。你是否也有PDB?在这个堆栈跟踪中,我们实际上看不到异常源自代码的地方。 – 2012-03-20 08:41:32

+0

不,我没有Telerik组件的PDB,这是第三方工具包。我对Telerik程序集内的WHERE不感兴趣,发生异常时,我需要知道我的页面上哪个控件导致了它。我的解决方案中有项目的PDB – cusimar9 2012-03-20 09:40:08

您可以显示这种例外如下

try 
{ 
} 
catch(Exception ex) 
{ 
    Response.Write("Source: " + ex.Source); 
    Response.Write("Message: " + ex.Message); 
    Response.Write("Stack Trace: " + ex.StackTrace); 
} 
+0

ex.ToString()? – Pankaj 2012-03-19 18:19:15

+0

我已经显示所有信息(请参阅我的帖子),但并未显示错误的所有详细信息 – cusimar9 2012-03-20 08:39:49

+0

然后您还可以在异常中添加更多类似如下信息如果Button1_Click发生异常,则添加如Response.Write( “PageName.aspx的Button1中引发的异常 – 2012-03-20 08:42:40

我无法履行而无需实现一些自定义代码我的要求。

我现在在MasterPage中添加了一些代码,每次回发时都存储__EVENTTARGET和__EVENTARGUMENT参数。只要有新的页面加载,这些都会被清除。如果发生错误,这些值构成调试电子邮件的一部分,这使我们能够了解错误发生时用户正在做什么。