19

我有一个小问题。有时,当我调试应用程序时,我想在调试会话期间模拟从方法抛出的异常,但没有办法做到这一点。我什至不能将光标(表示当前行的黄色光标)拖到异常块上。在运行期间触发异常的唯一方法是更改​​当前代码行并编写我要抛出的异常。这种方法不好,因为我可能会忘记在下次运行时将其改回。

4

6 回答 6

33

我发现在调试期间从方法中抛出异常的唯一真正可行的方法是从执行进程的脚下提取变量。即设置一个即将被使用的变量为null,显然一执行就会抛出异常。但是,这将不允许您抛出自定义异常(例如特定类型或消息)。

具体的异常我们需要根据之前的帖子修改代码。

于 2011-12-28T13:11:29.090 回答
17

您可以使用条件编译:

#if DEBUG
    throw new Exception("Test");
#endif

编辑:有一个额外的条件:

#if DEBUG && ENABLETESTEXCEPTION
    throw new Exception("Test")
#endif

您可以使用上述条件定义(项目属性->构建->条件编译符号)创建自定义配置(类似于发布/调试)。

于 2011-05-19T11:30:51.003 回答
14

不幸的是,Visual Studio 仍然不支持从即时窗口抛出异常。

以及不支持 lambda 表达式、匿名类型、集合初始值设定项等。仅 .NET 2.0 之类的东西。


你也可以使用Debug.Assert(false);

于 2011-05-19T11:36:54.787 回答
3

你可以使用

bool toThrow = false;
if(toThrow) 
{
     throw new Exception("Test");
}  

并将 throw 更改为 true。或者创建一个方法/属性并调用它们。

于 2011-05-19T11:47:14.917 回答
2

你这样做是为了测试你正在处理调用代码中的异常吗?

如果是这样,您可能想考虑编写一些单元测试并利用模拟框架来完成。

我有起订量(模拟) http://code.google.com/p/moq/的经验

网站上有一些教程可以设置和运行它,一旦你开始它就很容易了。

您需要首先在您的解决方案中设置一个测试项目,添加 Moq dll,然后编写一个测试方法来设置您的对象的 Moq 并告诉它抛出异常。

为了让对象上的方法抛出异常,它看起来像这样。

[TestMethod]
[ExpectedException( typeof( InvalidOperationException ) )]
public void YourMethod_ThrowsIOException()
{
    var mock = new Moq<YourClass>();
    mock.Setup( obj => obj.YourMethod( It.IsAny<string>() ) ).Throws<InvalidOperationException>();

    YouClass mockedClass = mock.Object;

    mockedClass.YourMethod( "anything" );
}

我希望这有帮助。

于 2011-05-19T11:42:53.637 回答
0

如果您正在阅读此答案,Visual Studio 2013 可用并支持在 64 位应用程序中编辑并继续。如果您有 Visual Studio 2013 并且只是在寻找一种在各处抛出异常以查看异常处理或错误页面如何工作的方法,只需使用“编辑并继续”并直接在代码中键入即可。

单击调试 > 开始调试。您的网络应用程序启动。放置断点。单击您的应用程序,直到断点命中。您现在可以自由地将 throw 语句添加到您的代码中!只需输入throw new Exception("test")或其他任何内容,保存文件,然后单击继续(推进您的调试器),它将处理您刚刚添加的行,就像您已经编译它一样。

于 2014-02-19T22:21:19.420 回答