在调试过程中强制抛出异常

27

在调试过程中是否有可能强制抛出异常?

举个例子:我正在调试一些代码,从互联网下载一个页面。当网络连接断开或网卡关闭时,应该会抛出 IOException 异常,但实际上执行却被阻塞了(在第二行)。

URLConnection connection = requestURL.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

我需要一种方法,在代码阻塞时强制抛出异常(在调试期间),以便跳转到catch块。

顺便说一下,我正在使用Netbeans。

在调试期间: 当执行线程暂停时手动添加。

编辑:换句话说,我需要注入-在运行时引发异常,而不影响当前代码!

谢谢。


1
模拟对象不是专门为了这个目的而发明的吗? - Alex Nikolaenkov
2
是的,如果你正在进行单元测试,但我不是... - FearUs
您可以编写一个单元测试来复现您的问题并进行调试。但是,如果您的系统耦合度高,这可能是一项困难的任务。 - Alex Nikolaenkov
7个回答

22

我会找到正在等待的变量,在Eclipse的表达式窗口中,调用该变量的notify方法,然后将该变量设置为null,这样同步块就会抛出NullPointerException异常。


这个想法可以扩展到抛出任何类型的异常。 :) - Jayan
3
在使用 Eclipse 时,您还可以在某个位置添加断点和观察表达式 "throw new FooBarException"。唯一的问题是,每次虚拟机暂停时都会对其进行评估。 - Axel Knauf
3
您可以将表达式标记为禁用状态,然后在任何时候想要它被抛出时,只需右键单击并选择“重新评估监视表达式”,它就会被仅抛出一次。 - Patrick

19
在Eclipse的调试视图中,Expressions视图中,只需添加新表达式:throw new Exception("test")。我想NetBeans也有类似的功能。

1
NetBeans 似乎没有那个功能。 - Aleksandr Dubinsky

2
我认为你需要将那段代码放进一个带有超时时间的FutureTask中,并让主线程等待超时或任务完成。
你还可以使用一些额外的系统属性,只在测试模式下抛出异常。
请参考这篇文章(免责声明,我写了它)。
希望能帮到你。

0
为什么不暂时修改代码以生成异常?(throw new IOException(...)) 或者,断开与互联网的连接并尝试运行它。

当互联网断开连接或网络卡下线时,线程会在第二行阻塞,就像我在问题中说的一样 :) - FearUs
1
它可能会在请求超时时阻塞,所以请耐心等待。此外,没有任何事情可以阻止您抛出自己的IOException。 - mdm
换句话说,我需要在运行时注入 - 调用异常,而不影响当前代码! - FearUs

0

如果线程处于等待状态(阻塞),则无法执行太多操作。您需要interrupt()等待的线程。JVM似乎具有此选项,您只需在调试器中找到它即可。


0

0

您还可以使用条件断点抛出异常。这种方式不需要修改您的代码。


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