无论技术或专业知识水平如何,处理异常都是一个常见问题。 它可能是一种令人沮丧的体验,找出异常导致代码中的问题的原因。 在Visual Studio中调试异常时,我们希望通过为你提供相关的异常信息来减少这种挫折感,以帮助你更快地调试问题。
出现异常时暂停
当调试器在发生异常时中断,对应的代码行右侧会显示异常错误图标。 非模式异常帮助程序将显示在异常图标附近。
检查异常信息
你可以立即在异常帮助程序中读取异常类型和异常消息,以及异常是已引发还是未处理。 可以通过单击 视图详细信息 链接来检查和查看 Exception 对象的属性。
分析空引用
从 Visual Studio 2017 开始,对于 .NET 和 C/C++ 代码,遇到 NullReferenceException 或 AccessViolation 时,你会在异常助手中看到空值分析信息。 分析显示为异常消息下方的文本。 在下图中,信息显示为“s 为空”。
注意
托管代码中的空引用分析需要.NET版本 4.6.2。 Universal Windows Platform (UWP)和任何其他 .NET Core 应用程序目前不支持 Null 分析。 仅在调试没有任何 Just-In-Time (JIT) 代码优化的代码时可用。
配置异常设置
你可以在异常帮助程序的“异常设置”部分将调试器配置为在引发当前类型的异常时中断。 如果调试器在引发的异常处暂停,则可以使用复选框禁止在将来引发该异常类型时中断。 如果你不想在此特定异常在特定模块中引发时中断,请在“异常设置”窗口中的“例外引发位置:”下方勾选模块名称旁的复选框。
检查内部异常
如果异常具有任何内部异常(InnerException,则可以在异常帮助程序中查看它们。 如果存在多个异常,可以使用调用堆栈上方所示的向左箭头和向右箭头在它们之间导航。
异常帮助程序 
检查重新引发的异常
在异常 thrown 的情况下,异常帮助程序会显示引发第一次异常的调用堆栈。 如果多次引发异常,则仅显示原始异常中的调用堆栈。
重新引发异常的异常帮助程序 
检查异步异常(.NET)
从 .NET 9 开始,当异步 Task 方法在 .NET 框架代码中引发异常时,Visual Studio调试器会自动中断。 这使得异步代码的调试更简单,特别是在 ASP.NET 中,因为异常通常会跨越异步边界被抛出。
查看调用堆栈
从 Visual Studio 2022 版本 17.3 开始,可以在“调用堆栈”窗口中查看异常堆栈帧。 对于异步异常,这增加了快速加载符号或定位源并直接转到异常站点的功能。 调用堆栈窗口中的异常堆栈帧提供标准调用堆栈功能,例如自动导航、快速切换帧、符号加载和反编译选项,以返回到引发异常的源代码。
获取 AI 帮助
如果你有 Copilot,则可以在调试异常时获得 AI 帮助。 只需查找Analyze with Copilot或Ask Copilot
按钮。 在这些方案中,Copilot已经知道问题上下文,因此无需在聊天中自行提供上下文。 有关详细信息,请参阅 Debug with Copilot。
如果Copilot希望访问“输出”窗口上下文以帮助分析问题,它将提示你在“聊天”窗口中提供此权限。 如果授予权限,则允许Copilot根据运行时详细信息对异常执行其他分析。 异常帮助程序、变量分析、代码检查和其他调试方案可以访问当前调试会话的此上下文。
获取存储库上下文的 AI 帮助
当您在Visual Studio中使用Azure DevOps存储库工作时,Copilot通过结合存储库上下文,实现更智能、更快速和更精确的异常分析和解决。 Copilot 会交叉引用你打开的存储库,包括过去的 bug、问题、拉取请求和历史修复,从而提供与你的代码库直接相关的可操作见解。
遇到异常时:
- Copilot标识最有可能的根本原因、受影响的组件和潜在修补程序。
- Copilot利用存储库知识来突出过去类似的问题和解决方法,帮助你从现有修补程序中吸取教训。
- 使用完整上下文分析复杂的异常,将运行时行为连接到历史模式,以便快速了解意外或不正确的值。
- 通过自动呈现相关的修补程序和见解,Copilot能够节省时间并减少调试复杂问题所需的反复试验。
对于需要端到端诊断(超出单个异常)的复杂 bug,可以使用调试器代理。 调试器代理提供了一个代理工作流,该工作流使用实时运行时数据重现、检测和验证修复。 有关详细信息,请参阅使用调试程序智能体以智能体方式解决 bug。
使用 Live Share 共享调试会话
在异常帮助程序中,你可以使用“启动 Live Share 会话...”链接来启动 Live Share 会话。加入 Live Share 会话的所有人都可以看到异常帮助程序以及任何其他调试信息。