【问题标题】:Force exception while debugging调试时强制异常
【发布时间】:2011-07-09 11:45:12
【问题描述】:

是否可以在调试时强制抛出异常

让我举个例子:我正在调试一些代码,我从互联网上下载了一个页面。当 Internet 连接丢失或网卡关闭时,应该抛出 IOException,但执行被阻塞(在第二行)

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

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

顺便说一句,我正在使用 netbeans。

调试时 = 在执行线程暂停时手动添加。

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

谢谢。

【问题讨论】:

  • 模拟对象不就是为了这个目的而发明的吗?
  • 是的,如果你在做单元测试,但我不是......
  • 您可以编写一个单元测试来重现您的问题并对其进行调试。但是,如果您的系统是紧密耦合的,这可能是一项艰巨的任务。

标签: java debugging exception netbeans


【解决方案1】:

我会找到正在等待的变量,然后在 Eclipse 的表达式窗口中,对该变量调用 notify,然后我将 null 输出该变量,以便同步块将抛出 NullPointerException

【讨论】:

  • !这个想法可以扩展到抛出任何类型的异常。 :)
  • 使用 Eclipse,您还可以在某处添加断点和监视表达式“throw new FooBarException”。唯一的问题是,每次 VM 挂起时都会对其进行评估。
  • @Axel 将表达式标记为已禁用,然后在您希望它被抛出时,只需右键单击它并“重新评估观察表达式”,它就会被抛出一次。
【解决方案2】:

在 Eclipse Debug 透视图中,在 Expressions 视图中,只需添加新表达式:throw new Exception("test")。我想 NetBeans 也有类似的东西。

【讨论】:

  • NetBeans 似乎没有。
【解决方案3】:

我认为您需要做的是将该代码包装在 FutureTask 中并设置一个超时,并让主线程等待超时或任务完成。

你也可以使用一些额外的系统属性来只在测试模式下抛出异常

看看this post(免责声明,我写的)

希望对你有帮助

【讨论】:

    【解决方案4】:

    为什么不只是临时修改代码以使其产生异常? (throw new IOException(...))。或者,断开互联网并尝试运行它。

    【讨论】:

    • 当网络断开或ntwork卡关闭时,线程阻塞在第二行,就像我在问题中所说的那样:)
    • 请求超时时可能会阻塞,所以请稍等。也没有什么可以阻止你抛出自己的 IOException。
    • 也就是说,我需要注入——运行时调用异常,不影响当前代码!
    【解决方案5】:

    如果您的线程正在等待(阻塞),您将无能为力。您必须 interrupt() 等待线程。 JVM 似乎有this option,你只需要在调试器中找到它。

    【讨论】:

      【解决方案6】:

      JDB 有一个kill 线程命令,开发人员可以在其中指定线程 id 和用于杀死线程的异常

      我找到了两个使用命令行 jdb 调试器的参考。见StackOverflow - Is it possible view/pause/kill a particular thread from a different java program running on the same JVM?How do I use kill call in JDB?

      我在 Eclipse Java 调试器中找不到类似方法的任何信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-10
        • 2019-05-24
        • 1970-01-01
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        相关资源
        最近更新 更多