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

时间:2012-03-19 17:57:31

标签: asp.net .net exception exception-handling global-asax

我有一个.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)

现在我很可爱,因为我知道a)控件的名称和b)导致控件超出范围的值。

有关如何获取此类信息的任何建议?我在调试模式下运行它,传递给Global.asax的对象似乎不再包含我能看到的更多细节。

3 个答案:

答案 0 :(得分:2)

将PDB与程序集一起发送。这样,您将在异常堆栈跟踪中获取行号和源代码文件名。一旦你有行号,就会知道你在那行写的是什么代码。

答案 1 :(得分:0)

如果没有实现一些自定义代码,我无法满足我的要求。

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

答案 2 :(得分:-1)

您可以显示如下例外

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