我可以想象您的挫败感,但您的 VisualStudio 设置肯定有些奇怪。我可以向您保证,在我的设置中,VS 永远不会捕获已处理的异常,并且在从 VS2008 到 VS2015 的所有 VS 版本中都是如此。
您在输出窗口中看到的“FirstChance 异常”行是一条信息,表明在触发任何处理程序或堆栈解除之前的那个时刻刚刚引发了异常。
但这并不意味着 VisualStudio 有任何中断。仅向调试输出写入一行代码,程序继续运行 - 堆栈展开,执行最近匹配的 catch,程序向前运行。
现在,VS/Debugger/CLR 可以在抛出异常时中断,但必须打开它。您可以通过 Debug->Windows->Exceptions 或按 CTRL+D+E 到达那里。当您单击它时,应该会出现一个新面板,其中包含一个例外列表以及每个例外的一个或两个选项:
但这可能会因您的 VS 版本而异。例如,在 VS Community 2015 中,只有“投掷时中断”,“未处理”是不可见的,但仍然对所有这些都有效。您只是无法关闭“未处理”的中断。
无论如何,重要的是默认情况下,所有“未处理”都被选中,而“抛出时”则没有或几乎没有。在 VS2015Community 中,我看到默认设置了以下“抛出时”:
- 一些 C++“Platform::xxxx”异常
- System.Reflection.MissingMetadata [
- System.Reflection.MissingRuntimeArtifact [
- System.Windows.Markup.XamlParseException [
- Javascript 异常:拒绝访问,代码 0x80070005
- 一些 ManagedDebuggingAssistants:LoaderLock、ContextSwitch...
- 一些 Win32 异常
仅此而已。也许总共有 10..20 种非常具体的类型,我没有数过。在“Common Language Runtime”组中,默认情况下只有 三个 被选中,即上面列出的那些。没有 InvalidCastExceptions。
如果您的 VS 在它被抛出的那一刻触发,那么这意味着您或有权访问您的 VS 的人对其进行了不同的配置。最有可能的是,在那个“ExceptionSettings”面板中,您将“InvalidCastException”标记为“抛出时中断”。去那里,查看“InvalidCastExceptions”复选框的状态并取消选中它,然后重试。
如果这对 InvalidCastExceptions 的情况有所帮助,并且如果此问题也发生在某些其他异常上,那么您可以对任何其他类型重复此操作您不想在抛出时中断 .是的,这意味着您(或其他人)在某个时间点点击了那里并检查了它们以破坏它们。
如果您将其中的许多都勾选为break-on-throw,那么您可以点击子树根并选中/取消选中整个组,而不是点击每一个。 (顺便说一句。也许你在一周或一个月前不小心点击并检查了整个组?)
此外,还有一个非常有用的“Restore Defaults”(恢复默认值),甚至还有一个名为“Restore the list to default settings”的按钮,这两个按钮都只是将所有内容重置为默认设置(就像我在上面写的列表中一样:一些 C++,一些反射,一些 win32 等等)。
最后,无论您在 ExceptionSettings 面板中 取消选择 break-on-thrown 的任何异常,VisualStudio 仍将中断任何未处理的异常。 (除非您看到另一组标记为“未处理”的复选框 - 即 VS2010Pro 中有这样的东西,但在 VS2015Community 中我看不到它......也许它是 Pro 的东西)