如何在Visual Studio调试时强制抛出异常?

63

我正在以调试模式运行我的应用程序,我想手动抛出异常(即不是在代码内部抛出)。有没有办法这样做?

当然,在命令或立即窗口中运行throw new Exception("My forced exception");是无效的。

编辑:我希望尝试-捕获语句可以捕获到我正在调试的代码的异常。


我已经回答了下面的问题,但是我很好奇你为什么要这样做? - Belogix
我有这个想法是因为我处于一个复杂的状态(正在处理一个大型文本文件),而能帮助我找出错误的catch实际上在更深层次,而我遇到的catch中没有另一个“throw”。 - thepaulpage
4个回答

88
一种可能的方法是在一行上进行断点,并手动更改代码路径中的可空变量为 null,以便在其操作之前发生。这将导致抛出 NullReferenceException

+1. 还有其他类似的“更改状态”操作(例如更改文件名、更改文本为不可解析等),允许代码本身触发异常。我认为没有办法添加永远不会被代码抛出的异常(如果有其他方法,也很感兴趣了解)。 - Alexei Levenkov
我认为我的答案更简洁,因为您可以从任何地方调用它。否则,您必须在您感兴趣的位置之前不断添加代码以抛出异常? - Belogix
5
假设该主题代码使用一个你可以更改的引用变量。如果该方法使用所有值变量呢? - RBarryYoung
此外,如果你所在的代码块中没有包含任何变量,你可以尝试将光标移动到方法的其他位置(通过拖动箭头),以触发其他地方的异常来解决问题。在我的情况下,我不得不将正在执行的下一行代码移到 if 代码块之外,以触发其他地方的空引用异常。 - jeromej

13

你可以添加一个类似于以下方法的方法:

public static void ThrowAnException(string message)
{
    throw new ApplicationException(message);
}

接着,您可以使用立即窗口,调用ThrowAnException("Whoops")


2
在立即窗口中的异常不会传递回运行代码状态,是吗? - RBarryYoung
4
我认为这样做违背了初衷。仅为调试异常而添加此代码似乎是个糟糕的想法。我宁愿修改状态并触发异常来达到目的。 - Brian Rasmussen
2
@Brian Rasmussen:实际上,我非常赞同Belogix的观点,即在运行时手动修改状态似乎容易出错,并且很容易产生意外的副作用。此外,你想要修改的状态有时并不容易访问。像这样的公共静态方法可以随时放入调试工具类/库中,并从任何地方调用。 - RBarryYoung
2
虽然这样确实会抛出一个异常,但是运行代码却无法捕获该异常。我试过设置一个示例,在调试器中使用try-catch来调用ThrowAnException()函数。异常是在调试器中抛出的,但却没有被捕获。我可以继续运行代码,就好像从未发生过异常一样。 - Ryan Kohn
3
代码不会被卡住,只会在调试器中抛出一个异常,而这不会影响应用程序。 - TigOldBitties
显示剩余4条评论

1
如果您正在单元测试的上下文中运行,并且想要引发异常的点在注入的接口或类后面,您可以创建一个抛出异常的模拟对象。这样做的好处是,一旦您确认已经复制了错误,您可以为回归套件构造一个新的单元测试。

-6

尝试在断点处使用即时窗口。


4
我先尝试了这个,但它不起作用:“无效的表达式项 'throw'”。 - Ryan Kohn
创建一个名为ThrowMyException()的函数怎么样?然后通过立即窗口调用该函数呢? - Localghost
1
请更新您的回答,包括如何使用即时窗口解决这个问题的完整说明。 - Tod Birdsall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接