【译】Exception Helper – Rethrown Exceptions

  是否曾经在异步编程时引起过异常?由于调试器没有显示异常发生的位置而感到沮丧?或者在查看具备内部异常的异常时感到沮丧?调试器不容易显示该异常来自何处。从 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()中的源位置,而后设置一个断点,以便下次运行场景时命中。而后,当遇到断点时,您将被中止在异常产生的位置,以及您可能但愿进一步的调试,并尝试修改以修复问题。async

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

IntelliTrace

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

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

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

原文连接

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

相关文章
相关标签/搜索