【问题标题】:How to get more detail from an exception?如何从异常中获取更多细节?
【发布时间】:2026-02-08 14:25:01
【问题描述】:

我有一个 .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 的对象似乎没有我能看到的更多细节。

【问题讨论】:

  • 你需要catch它发生的异常并从那里记录它以获得你正在寻找的信息。
  • 您是否尝试过覆盖MasterPage.OnError(EventArge)
  • 您如何获得已经显示的数据?是否异常不包含您想要的信息?如果是这样,除非您能够向抛出的异常添加更多数据,否则您可能会不走运......
  • 感谢 Brian,但是对于一个包含 1000 个控件的应用程序,为每个控件设置单独的处理程序有点不切实际
  • @cusimar9:你有母版页吗?试着处理进去。

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


【解决方案1】:

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

【讨论】:

  • 我在上面发布的错误是所有调试选项都打开并在 IDE 中运行
  • @cusimar9,您显示的错误在一些 Telerik 程序集中。你也有它的PDB吗?在此堆栈跟踪中,我们实际上无法看到异常源自您的代码的位置。
  • 不,我没有 Telerik 程序集的 PDB,这是一个第三方工具包。我对 Telerik 程序集中发生异常的位置不感兴趣,我需要知道我的页面上的哪个控件导致它。我的解决方案中确实有项目的 PDB
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以显示如下异常

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

    【讨论】:

    • 我已经显示了所有这些信息(请参阅我的帖子),但它没有显示错误的所有详细信息
    • 那么你也可以在Exception中添加一些类似这样的信息如果Button1_Click中发生异常然后添加像Response.Write("Exception Caused in Button1 of PageName.aspx