是否曾经在异步编程时引发过异常?因为调试器没有显示异常发生的位置而感到沮丧?或者在查看具有内部异常的异常时感到沮丧?调试器不容易显示该异常来自何处。从 Visual Studio 2019 16.5 版本开始,异常帮助器现在包含了重新抛出的异常的原始调用堆栈功能。这有助于找出代码中任何重新抛出异常的根本原因。这在异步异常的情况下尤其有用,异步异常被框架代码捕获并重新抛出。

  上面的截图来自一个简单的程序,该程序使用'await'模式。

tatic async Task Main(string[] args)
{
await a();
}
async static Task<string> a()
{
return await b();
}
async static Task<string> b()
{
return await c();
}
async static Task<string> c()
{
string s = null;
return await Task<string>.FromResult(s.ToLower());
}

  在本例中,异常在 s.ToLower() 处抛出,异常在 await a() 处变为“未处理”,并且由于 await 在C#中的工作方式,调试器将停止。不幸的是,所有有用的信息都回到了 c() 中。现在,随着 Visual Studio 2019 16.5 中的更改,您可以在调用堆栈中看到异常帮助器中最初抛出异常的位置。

  在本例中,您可以单击 Program.cs,链接并导航到调用堆栈顶部ConsoleApp5.Program.c()中的源位置,然后设置一个断点,以便下次运行场景时命中。然后,当遇到断点时,您将被停止在异常产生的位置,以及您可能希望进一步的调试,并尝试修改以修复问题。

  虽然可以使用此功能导航到正确的源代码,但不能使用监视来检查应用程序的状态,就像最初抛出异常时一样。这仅仅是因为自那时起其他代码已经运行,这可能会改变应用程序的状态。但是,如果您使用的是 Visual Studio 2019 Enterprise,则还有另一个选项 IntelliTrace。

IntelliTrace

  使用 IntelliTrace,VS 将在某些点捕获应用程序的状态,包括引发异常时,您可以返回并检查以前的状态。最简单的方法是查看诊断工具窗口的"事件"选项卡。在事件选项卡中,您将看到每个异常的事件。在此异步示例中,每个异步方法都有相应的引发和捕获的异常事件。如果您单击其中任何一个,IntelliTrace 会将调试器带回该时间点,您可以使用监视窗口检查状态。

  除了大多数例外情况外,您可能想要转到第一个实例,因为那是它第一次引发的地方。值得一提的是,并不是所有的状态都针对每个异常被捕获,诸如局部变量和参数之类。如果要在监视窗口中输入新表达式,它可能不会计算。如果要捕获应用程序的所有状态,应启用 IntelliTrace 快照功能。您可以通过访问 Tools Options -> IntelliTrace 并启用"IntelliTrace snapshots(managed and native)"来执行此操作,如下所示。

  使用 IntelliTrace 快照捕获应用程序的整个状态,您可以通过局部变量和监视窗口检查应用程序中的任何内容。

原文链接

  https://devblogs.microsoft.com/visualstudio/exception-helper-rethrown-exceptions/

【译】Exception Helper – Rethrown Exceptions的更多相关文章

  1. Java Exception & RTTI

    Exception Try { ... ... } catch (Exception ex) { …; throw new Throwable(ex); } catch (Throwable ex) ...

  2. JAVA fundamentals of exception handling mechanism

    Agenda Three Categories Of Exceptions Exceptions Hierarchy try-catch-finally block The try-with-reso ...

  3. Error Handling and Exception

    The default error handling in PHP is very simple.An error message with filename, line number and a m ...

  4. JMS - Exceptions

    The JMSException JMS defines JMSException as the root class for exceptions thrown by JMS methods. JM ...

  5. [译]Serilog Tutorial

    在过去的几年中,结构化日志已经大受欢迎.而Serilog是 .NET 中最著名的结构化日志类库 ,我们提供了这份的精简指南来帮助你快速了解并运用它. 0. 内容 设定目标 认识Serilog 事件和级 ...

  6. [译]Async/Await - Best Practices in Asynchronous Programming

    原文 避免async void async void异步方法只有一个目的:使得event handler异步可行,也就是说async void只能用于event handler. async void ...

  7. 写出简洁的Python代码: 使用Exceptions(转)

    add by zhj: 非常好的文章,异常在Python的核心代码中使用的非常广泛,超出一般人的想象,比如迭代器中,当我们用for遍历一个可迭代对象时, Python是如何判断遍历结束的呢?是使用的S ...

  8. Handling Errors and Exceptions

    http://delphi.about.com/od/objectpascalide/a/errorexception.htm Unfortunately, building applications ...

  9. WebDriver API——第2部分Exceptions

    Exceptions that may happen in all the webdriver code. exception selenium.common.exceptions.ElementNo ...

随机推荐

  1. Hive的压缩存储和简单优化

    一.Hive的压缩和存储 1,MapReduce支持的压缩编码 压缩格式 工具 算法 文件扩展名 是否可切分 对应的编码/解码器 DEFLATE 无 DEFLATE .deflate 否 org.ap ...

  2. mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比,于是写了个插件。

    使用mybatis逆向工程的时候,delete方法的使用姿势不对,导致表被清空了,在生产上一刷新后发现表里没数据了,一股凉意从脚板心直冲天灵盖. 于是开发了一个拦截器,并写下这篇文章记录并分享. 这锅 ...

  3. 关于adb的下载和基本使用

    我们无论是开发还是测试,对Android SDK一定都不陌生,如果我们要使用adb(Android debug bridge)命令,那么这个就必不可少了. 1.给大家提供一个下载地址:https:// ...

  4. Markdown 主题修改

    加粗字体的颜色修改 strong, b{ color: #111111; } 斜体的颜色修改 em, i { color: #111111; } 高亮字体的背景颜色修改 #write mark { b ...

  5. GatewayWorker与ThinkPHP等框架结合

    使用GatewayWorker时开发者最关心的是如何与现有mvc框架(ThinkPHP Yii laravel等)整合,以下是官方推荐的整合方式. 见示意图: ## 总体原则 现有mvc框架项目与Ga ...

  6. Nice Jquery Validator 自定义规则

    规则定义方式 (1). 正则 适用于使用单个正则能搞定的验证. // 使用数组包裹正则和错误消息,规则不通过时提示该消息 mobile: [/^1[3458]\d{9}$/, '请检查手机号格式'] ...

  7. DockerFile构建镜像和Docker仓库

    利用commit理解镜像构成 注意: docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现 场等.但是,不要使用 docker commit 定制镜像,定制镜像应该 ...

  8. mitmdump+python的使用(代码篇)

    mitmproxy+python代码篇 一.上个推文我们介绍了mitmdump的简单操作,下面我们开始学习,mitmdump配合python脚本的使用.第一点先讲日志输出.请看图片 先导入ctx模块: ...

  9. (六)maven 聚合和继承

    项目目录 my_test 聚合pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  10. 小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列

    目录 简介 JIT编译器 Tiered Compilation分层编译 OSR(On-Stack Replacement) Deoptimization 常见的编译优化举例 Inlining内联 Br ...