任务中重新抛出异常 (TPL) 丢失堆栈跟踪

2024-02-28

我有重新抛出异常的代码。

当我后来从 task.Exception 读取异常时,它的堆栈跟踪指向我重新抛出异常的位置(如我所料,第 n 行而不是第 m 行)。

为什么会这样呢? TPL 中的错误或更可能是我忽略的东西。

当我解决方法时,我可以将异常包装为新异常中的内部异常。

internal class Program
{
    private static void Main(string[] args)
    {
        Task.Factory.StartNew(TaskMethod).ContinueWith(t => Console.WriteLine(t.Exception.InnerException));
        Console.Read();
    }

    private static void TaskMethod()
    {
        try
        {
line m:     throw new Exception("Todo");
        }
        catch (Exception)
        {
line n:     throw;
        }
    }
}

不幸的是,由于 TPL 在任务执行完成之前存储异常的方式,导致原始堆栈跟踪丢失。在 LINQPad 中运行示例代码显示异常抛出于at System.Threading.Tasks.Task.Execute(),这显然是不正确的。

作为一个粗略的解决方法,您could将原始堆栈跟踪(它是一个简单的字符串)存储在Data原始异常的属性,然后您就可以访问它:

private static void TaskMethod()
{
    try
    {           
        throw new Exception("Todo");
    }
    catch (Exception ex)
    {
        ex.Data["OriginalStackTrace"] = ex.StackTrace;
        throw;
    }
}

然后你将把原始的堆栈跟踪存储在OriginalStackTrace的值Data字典:

这不是你真正想要的,但我希望它有帮助。

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

任务中重新抛出异常 (TPL) 丢失堆栈跟踪 的相关文章

随机推荐

  • 如何从c目标文件生成可执行文件?

    如何将目标文件制作为可执行文件 您需要链接目标文件 您的命令 gcc c o file cgi file c 将 file c 编译为目标文件 通常称为file o 如果你摆脱了 c 它将直接生成可执行文件 gcc o file cgi f
  • x 轴转换为浮点数

    我正在尝试绘制按年份分组的数据 并且对于每年 我想计算用户数量 下面 我刚刚将日期列从浮点转换为整数 This is my plot 如果您看到 x 轴 我的年份代码似乎已变成浮点数 并且每个代码相距 0 5 个刻度 我如何使其成为纯整数
  • 在Linux上编译VLC:错误找不到Lua

    我正在尝试为 Linux 编译 VLC 当我运行配置脚本时 我收到错误消息 配置 错误 找不到 lua 有些人需要Lua 接口 rc telnet http 以及许多其他自定义脚本 使用 disable lua 忽略此错误 我的系统上有lu
  • Ruby,没有将 Symbol 隐式转换为 Integer

    昨天我已经在 没有将 Symbol 隐式转换为 Integer Ruby https stackoverflow com questions 38482973 no implicit conversion of symbol into in
  • shell命令SET -X在脚本中的意思[重复]

    这个问题在这里已经有答案了 所以我有一个文件部署 sh 并且它有 shell 脚本 自从我知道这件事以来 我就有点困惑 这是什么意思set x实际上意味着 运行该文件后 我观察到在文件中的命令后面写入的命令在终端中被提及 sign 就像如果
  • 文档中的 tf.data.Dataset.window 示例失败

    我正在尝试使用一个例子TF文档 https www tensorflow org api docs python tf data Dataset window for tf data Dataset window并且文档中的示例失败了 源自
  • 使用外键批量插入表

    我有一个客户表 其中包含客户的详细信息 以下是字段 CustId PrimaryKey Name Date of Birth 我有另一个表 资产信息 有以下字段 AssetId PrimaryKey AssetValue CustId Fo
  • 尝试执行 jQuery AJAX 调用时 JavaScript 错误意外标识符

    我有这个 jQuery 代码
  • 当前上下文中不存在名称“SqlDataSourceEnumerator”

    在 Visual Studio 中的 C net 5 程序中 我正在测试使用 SqlDataSourceEnumerator 的代码 public static List
  • 全关联缓存是否比直接映射缓存具有更高的未命中率?

    以下是一个面试问题 为什么全关联缓存的未命中率可能高于直接映射缓存 我认为这根本不可能 有人可以分享一些对此的见解吗 你应该假设它们大小相同吗 如果不是 则如果大多数未命中是 容量 未命中 而不是冲突未命中 则较小的全关联高速缓存仍然可能会
  • 如何让MySQL正确处理UTF-8

    的回应之一我昨天问的一个问题 https stackoverflow com questions 198721 converting a word document into usable html in php建议我确保我的数据库可以正确
  • 更新反应组件而没有父组件在其之外

    如果组件没有父组件 我应该如何正确更新组件 我找到了两种方法来做到这一点 第一种方法 https jsfiddle net 69z2wepo 28597 这里我通过改变组件的状态来更新组件 var Hello React createCla
  • 捕获无法处理的异常并重新加注

    这是我的问题的后续使用 SQLAlchemy 和多处理挂入 Python 脚本 https stackoverflow com questions 8785899 hang in python script using sqlalchemy
  • jquery 附加到列表的前面/顶部

    我有这个无序列表 ul li two li li three li ul 有没有办法可以将其添加到无序列表中 使其最终像这样 ul li ONE li li two li li three li ul 请注意 ONE 已添加到列表的前面 顶
  • 打开 ViewPager2 到特定位置而不滚动

    我已经用一些视频实现了回收视图 say 10 单击任何项 目都会打开一个viewpager2 which is on some other activity与所有物品and单击的一个 来自recyclerview 显示 之后 用户只能从那里
  • 是否可以让 Visual Studio 索引源代码以改进字符串搜索?

    我经常在 VS2008 中使用字符串搜索功能来构建整个解决方案 有没有办法通过让 VS2008 索引所有源代码和配置文件来提高其搜索速度 类似于 Google 桌面索引文件的方式 这增加了对 VS 解决方案中所有文件的即时全文搜索 不是免费
  • 设置 Gin 中未找到的路由

    我在 Gin 中设置了默认路由器和一些路由 router gin Default router POST users save router GET users getAll 但是我该如何处理 Gin 中找不到 404 路线呢 最初 我使用
  • 如何处理 JSF 中的动态角色或用户名更改?

    我有一个在 glassfish 2 1 上运行的 JSF 应用程序 具有 EJB 3 后端 对于身份验证 我使用自定义领域 用户使用他在注册时指定的电子邮件地址和密码进行身份验证 一切都运转良好 现在我有两个相关的问题 1 用户可以编辑他的
  • Xcode 4 Preview 2 是否足够稳定,可以用于开发?

    Xcode 4 Preview 2 是否足够稳定 可以用于开发 由于最终版本已经出来 这个线程可以忽略 从我最近看到的情况来看 它相当不稳定 在崩溃之前很难使用它超过几分钟 我当然不会在实际项目中使用它
  • 任务中重新抛出异常 (TPL) 丢失堆栈跟踪

    我有重新抛出异常的代码 当我后来从 task Exception 读取异常时 它的堆栈跟踪指向我重新抛出异常的位置 如我所料 第 n 行而不是第 m 行 为什么会这样呢 TPL 中的错误或更可能是我忽略的东西 当我解决方法时 我可以将异常包