这已经永远存在了,但是我想知道是否有人找到了解决方案...
有时,我禁用Visual Studio中所有“公共语言运行时异常”的“仅我的代码”(这几天与启用SourceLink结合使用)并打开“抛出时中断”,因为我想检查吞下异常的问题由第三方图书馆提供。
完成并重新启用“ Just My Code”,并为所有“ Common Language Runtime Exceptions”启用“ Throwed Breaked”后,有时我仍然会在第三方库抛出HANDLED异常时中断。意思是,第三方库有一个我不希望看到的无声异常,但是Visual Studio还是会中断。例如,该库可能具有预期的TCP连接超时,但是Visual Studio仍然中断。我只希望在“仅我的代码”被禁用时才会发生这种情况。
通常,我必须重新启动Visual Studio,有时会清除所有缓存的调试信息,这会使其他操作变慢。
有人找到解决方法吗?
更新:请参见显示意外行为的屏幕截图。启用“仅我的代码”,选中“抛出时中断”,无论如何都会弹出第三方代码中的已处理异常。如果重新启动Visual Studio(有时也清除缓存),则停止使用相同的设置进行提示。似乎有些事情使得即使禁用了Source Link也可以将外部库视为“我的代码”。
谢谢。
答案 0 :(得分:1)
原因非常简单,并在Microsoft docs文章中指定。指定是否使用Visual Studio中的“仅我的代码”仅调试用户代码。注意这一点:
异常行为
如果非用户代码中发生未处理的异常, 调试器在用户代码中发生异常的行处中断 生成。
如果为该异常启用了首次机会异常,则 用户代码行以绿色突出显示。调用堆栈显示一个 带注释的帧,标记为[外部代码]。
在C ++中也是这样:
异常行为
当调试器遇到异常时,它将在该异常时停止 不管是使用用户代码还是使用非用户代码。的 例外对话框中用户未处理的选项将被忽略。
当您引用第三方库时,该库将嵌入您的.pdb symbol中 因此,使其成为代码的一部分。当您调试“仅我的代码”时,调试器知道它不会在您的任何“非托管代码”上中断,但会在第三方库上发生未处理的异常时中断。
有一种超越它的方法(例如,参见文章.pdb symbol),您可以指定.pdb文件中将包含哪个模块。这可能会解决您的问题,很难的是我还没有亲自测试过。
关于您的声明:
通常,我必须重新启动Visual Studio,有时还要清除所有缓存的 调试信息,这会减慢其他操作的速度。
是真的,因为然后Visual Studio必须再次编写.pdb符号,因此您最多只能使用一两次,然后又恢复到不需要的行为。
我的猜测是,除非在调试时明确指定其他内容,否则Microsoft希望在调试时通知您未处理的异常,即使在第三方库中也是如此,这样您就可以知道代码中的问题。