在 .NET 异常中保留原始 StackTrace/LineNumbers

2024-03-24

了解之间的区别throw ex and throw,为什么在这个例子中保留了原来的StackTrace:

    static void Main(string[] args)
    {
        try
        {
            LongFaultyMethod();
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.StackTrace);
        }
    }

    static void LongFaultyMethod()
    {
        try
        {
            int x = 20;
            SomethingThatThrowsException(x);
        }
        catch (Exception)
        {
            throw;
        }
    }

    static void SomethingThatThrowsException(int x)
    {
        int y = x / (x - x);
    }

但不是在这个:

    static void Main(string[] args)
    {
        try
        {
            LongFaultyMethod();
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.StackTrace);
        }
    }

    static void LongFaultyMethod()
    {
        try
        {
            int x = 20;
            int y = x / (x - 20);
        }
        catch (Exception)
        {
            throw;
        }
    }

第二种情况产生的输出与throw ex would?

在这两种情况下,人们都希望看到 y 初始化的行号。


我不确定此限制是否存在于 C# 语言、CLI 或 Microsoft 实现中,但您的第二个示例是显式调用的情况Exception.InternalPreserveStackTrace是需要的,如以下帖子中所述。由于该方法是internal,一般必须通过反射来调用。通过创建一个Action<Exception>用于通话,如本答案末尾所示。

参考:重新抛出异常并保留完整的调用堆栈跟踪 http://weblogs.asp.net/fmarguerie/archive/2008/01/02/rethrowing-exceptions-and-preserving-the-full-call-stack-trace.aspx

Edit:在重新检查 ECMA-335 Partition I §12.4.2(异常处理)和 Partition III §4.24(重新抛出)之后,我现在相信您所看到的行为是 CLR(Microsoft 的 CLI 实现)中的语义错误。对该行为的唯一具体提及是“Arethrow不会改变对象中的堆栈跟踪。”在这里描述的情况下,重新抛出实际上改变了堆栈跟踪,使得PreserveStackTrace破解已知 CLR 缺陷的解决方法。

static void LongFaultyMethod() 
{ 
    try 
    { 
        int x = 20; 
        int y = x / (x - 20); 
    } 
    catch (Exception ex) 
    { 
        PreserveStackTrace(ex); // <-- add this line
        throw; 
    } 
} 

PreserveStackTrace以下是对该博客条目的优化:

private static readonly Action<Exception> _internalPreserveStackTrace =
    (Action<Exception>)Delegate.CreateDelegate(
        typeof(Action<Exception>),
        typeof(Exception).GetMethod(
            "InternalPreserveStackTrace",
            BindingFlags.Instance | BindingFlags.NonPublic));

public static void PreserveStackTrace(Exception e)
{
    _internalPreserveStackTrace(e);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET 异常中保留原始 StackTrace/LineNumbers 的相关文章

  • wcf json网络服务

    创建 JSON Web 服务的最佳方法是什么 我们还有另一个使用 Java 的团队 他们坚持使用 JSON 完成所有通信 我更喜欢使用 WCF 而不是任何第三方框架 我找到了这个博客 http www west wind com weblo
  • dalvikvm中Android异常

    当我在手机上启动应用程序时 我从日志中收到很多以下错误 E dalvikvm 2052 No free temp registers E dalvikvm 2052 Jit aborting trace compilation revert
  • 如何在.NET 3.5中进行动态对象创建和方法调用

    创建类对象的代码看起来如何 string myClass MyClass 上面的类型 然后调用 string myMethod MyMethod 在那个物体上 Use Type GetType string http msdn micros
  • 用于 mvc3 日期格式和日期验证的文本框

    我决定开始使用 MVC 3 并且在尝试将我的一个 Web 应用程序重做为 MVC3 时遇到了这个问题 我的项目是这样设置的 public class Project public int ProjectID get set Required
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 何时使用 IComparable 与何时使用IComparer

    我正在尝试找出我需要实现哪些接口 他们本质上都做同样的事情 我什么时候会使用其中一种而不是另一种 好吧 他们不是quite与IComparer
  • web.config 转换为

    我有针对多个环境的 web config 转换 在配置文件中 我有一个 applicationSettings 部分 其中包含多个设置和值对 我尝试过根据用于匹配名称的语法并更改连接字符串以匹配设置并更改值 但转换失败 这是可能吗 所以我的
  • & 在 xml 文件中算作一个还是多个字符?

    我正在使用的 XML 模式具有特定的字符串字符长度 所以我可能有一个类似的字符串 Jim Mary 在 C 中是 10 个字符 但是当它写入 xml 时 它会变成 Jim amp Mary 如果 XML 模式规定字符串最多只能有 10 个字
  • EF数据库首先如何针对数据库更改更新模型?

    在班级图书馆Ado net Entity Data Model已生成 POCO 类 这些是第一次生成的 但数据库更改并未得到反映 在edmx图表右键单击并选择Update Model from Database显示新创建的表 但即使选择添加
  • ASP.NET Web Api 2 中的异常处理

    Problem 我需要处理 Web api 2 异常并返回一个具有正确状态代码的丰富对象 401 表示未经授权 404 表示 ContentNotFound 等 以及一些额外信息作为内容 此外 我需要内容看起来像序列化的Exception对
  • 从嵌入 C# 的浏览器控件获取 HTML 源代码

    我有一个嵌入在 C Windows 应用程序中的浏览器控件 我想获取渲染的 HTML 可能已被 javascript 修改 而不是原始 HTML 有什么建议么 您可以获取 HTML 并确实设置它 使用WebBrowser DocumentT
  • FileInfo.BaseName 存在于 PowerShell 中,但不存在于直接 .NET 中

    为什么在 NET 中System IO FileInfo对象没有BaseName属性 但我可以通过 PowerShell 使用该属性 例如 FolderItems Get ChildItem Path C Where Object isno
  • 使用 ContractNamespace 属性设置 WCF DataContract 命名空间

    在设计我的服务时 我决定要自定义出现在生成的 WSDL 中的名称空间 对于数据合同 我遇到了合约命名空间 http msdn microsoft com en us library system runtime serialization
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L

随机推荐

  • ReactJS:在 box-shadow 中使用 rgba 和 styled-components 道具不起作用

    我正在建造一个ReactJS地点和使用样式组件 with ThemeProvider 所以我的背景颜色或颜色CSS代码是这样的background color props gt props theme background 现在我想创建一个
  • NSArray 充满了 NSDictionaries。如何找到对象的索引?

    我有一个array里面充满了NSDictionaries 我想找到index其中一本词典的内容 但我对这本词典的了解只是一个value对于钥匙 name 我该怎么做 查找第一个字典的索引theArray其价值 name is theValu
  • 从Series中获取索引和值

    我在 pandas 中进行选择和索引时有点缓慢 我有一个日期时间系列 我试图从中选择某些元素及其日期时间索引 以便将它们附加到新系列中 例子 import pandas as pd x pd Series 11 12 13 14 15 16
  • 如何在不安装包的情况下运行测试?

    我有一些 Python 包和一些测试 文件排列如下http pytest org latest goodpractices html choosing a test layout import rules http pytest org l
  • 需要Python 2.6版本,在注册表中没有找到

    无法下载任何 python Windows 模块并安装 我想尝试使用 scrapy 框架和 stackless 但由于错误 需要 Python 版本 2 6 在注册表中找不到 而无法安装 尝试将其安装到 Windows 7 64 位机器 我
  • “潜在的空取消引用”上出现 Clang 错误。

    我不断收到以下类型的代码中的 Clang 错误 但我不明白为什么它们会出错 也不知道如何解决它们以使 Clang 满意 NSString checkForLength NSString theString error NSError err
  • Kendo 网格中的列线不同步

    我的剑道网格有太多列 最初我选择隐藏一些列 但后来我决定用水平滚动条显示所有列 我通过为每列分配宽度来做到这一点 当我这样做时 每列之间的行与标题行不同步 我的意思是 网格数据部分中的行相对于标题行稍微向左移动 为了澄清 当我给出每列的宽度
  • NHibernate 没有外键的映射集合

    我有一个名为WorkingDays 的课程 该课程需要一组日期 这些日期是银行假日的日期 在我们的数据库中 我们有一个包含这些日期的表 我希望 nhibernate 获取所有这些日期并填充bankHolidays 集合 然而 问题是我没有一
  • 如何检查文件是否是图像?

    我可以检查某个文件是否是图像吗 在 PHP 中如何做到这一点 如果文件不是图像 我想发出警报消息 此外getimagesize http www php net manual en function getimagesize php 您可以
  • 具有多个主类的 Gradle 应用程序插件

    我正在使用 gradle application 插件来启动我的应用程序 这效果很好 现在我想添加在同一项目中启动不同主类的选项 我可以更改插件的配置以允许这样做吗 apply plugin application mainClassNam
  • 当尝试设置从 MySQL 返回的布尔值时,Dapper 抛出无效的强制转换异常

    我有这门课 public class User public int UserId get set public string UserName get set public bool IsValidated get set 我使用 dap
  • WooCommerce:当客户离开然后回来时如何保留结账信息?

    有没有一种简单的方法或插件可以保留客户离开和回来后输入的结账信息 这个插件 https ur wordpress org plugins woocommerce checkout manager 保留 客户来回导航时的字段信息 但是它最近有
  • 如何在 Postgres 中运行通过 pgagent 创建的作业

    使用 pgagent 创建了一个作业 它已成功创建 但无法检查其状态是否正在运行 它都没有执行我在步骤中给出的指定代码 使用的版本 x86 64 pc linux gnu 上的 PostgreSQL 9 6 2 由 gcc GCC 4 4
  • python在加载模块时捕获NameError

    我试图捕获无法加载模块时发生的任何异常 当前的结果是 except 块没有被执行 import sys def loadModule module try import module except print Cannot load s F
  • 如何在DBeaver中使用sqlcmd GO批量分隔符?

    我需要使用GO1 https learn microsoft com en us sql t sql language elements sql server utilities statements goDBeaver IDE 中的熟食器
  • 获取属于任意类型的单元名称(TRttiType)

    我需要获取任何单元的名称 命名空间 TRttiType http docwiki embarcadero com CodeSamples en Category 3aRtti TRttiType 到目前为止 我已经尝试了以下方法 1 使用P
  • iTunes Connect 预发布版本无效。

    当尝试提交应用程序存档时 我在 Xcode 中收到以下错误 错误 ITMS 9000 预发布列车无效 列车版本 2 1 5 已关闭以提交新版本 有人有解决方案吗 该版本已经等待审核 我拒绝了它 现在正在尝试提交新版本 版本号相同 但我增加了
  • 覆盖 Primefaces 特定小部件的方法

    我想覆盖 Primefaces 数据表组件的函数 根据这个问题 如何在基于 widgetVar 的 Primefaces 组件中查找和 或覆盖 JavaScript https stackoverflow com questions 275
  • 如何强制内联div保持在同一行?

    我正在尝试制作三列布局 我希望左列和右列的宽度仅与其子项内容一样宽 我希望中心柱能够扩大以填充剩余空间 我正在尝试以下操作 概述 下面包含 jsfiddle 链接 colLeft display inline float left colC
  • 在 .NET 异常中保留原始 StackTrace/LineNumbers

    了解之间的区别throw ex and throw 为什么在这个例子中保留了原来的StackTrace static void Main string args try LongFaultyMethod catch System Excep