我有一个小问题。 有时当我调试应用程序时,我想在调试会话期间模拟从方法抛出的异常,但是没有办法做到这一点。 我甚至无法将光标(指示当前行的黄色光标)拖动到异常块。 在运行期间触发异常的唯一方法是更改当前代码行并编写我想要抛出的异常。这种方法并不好,因为我可能忘记在下次运行中将其更改回来。
答案 0 :(得分:32)
我发现在调试期间从方法中抛出异常的唯一真正可行的方法是从执行过程的脚下拉出变量。即设置一个即将用于null的变量显然会在执行时立即抛出异常。 但是,这不允许您抛出自定义异常(例如特定类型或消息)。
对于特定的例外情况,我们需要根据以前的帖子修改代码。
答案 1 :(得分:17)
您可以使用条件编译:
#if DEBUG
throw new Exception("Test");
#endif
编辑:有一个额外的条件:
#if DEBUG && ENABLETESTEXCEPTION
throw new Exception("Test")
#endif
您可以使用上述条件定义(项目属性 - > Build->条件编译符号)创建自定义配置(类似于Release / Debug)。
答案 2 :(得分:14)
不幸的是,Visual Studio仍然不支持从立即窗口抛出异常。
同样不支持lambda表达式,匿名类型,集合初始化器等。仅限.NET 2.0。
您也可以使用Debug.Assert(false);
答案 3 :(得分:3)
您可以使用
bool toThrow = false;
if(toThrow)
{
throw new Exception("Test");
}
并将throw更改为true。或者创建一个方法/属性并调用它们。
答案 4 :(得分:2)
您是否这样做是为了测试您是否在调用代码时处理异常?
如果是这样的话,你可能会想要编写一些单元测试并利用一个模拟框架来解决问题。
我有Moq(模拟)的经验 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" );
}
我希望这会有所帮助。
答案 5 :(得分:0)
如果您正在阅读此答案,Visual Studio 2013可用,并支持在64位应用程序中编辑和继续。如果你有Visual Studio 2013,并且只是想找到一种方法来抛出异常,看看你的异常处理或错误页面是如何工作的,只需使用编辑并继续,直接输入你的代码。
点击调试&gt;开始调试。您的网络应用程序启动。放置一个断点。点击您的应用,直到断点点击。您现在可以自由地将throw语句添加到代码中!只需输入throw new Exception("test")
或其他任何内容,保存文件,然后单击继续(推进调试器),它将处理刚刚添加的行,就像编译它一样。