【问题标题】:Exception in try-catch-block is not caught in JavaJava 中未捕获 try-catch-block 中的异常
【发布时间】:2015-02-20 17:04:38
【问题描述】:

我对 Java 很陌生,偶然发现一个问题,我无法理解(我正在使用 Eclipse Luna 进行开发和执行):

我调用了一个可能引发错误的方法并用 try-catch-block 包围它:

try {
  transaction.execute();                
} catch (ModbusIOException e) {
  log.debug("Fehler bei Modbustransaction: ModbusIOException - " + e.getMessage());
  e.printStackTrace();
} ... // more catches

执行方法实际上会抛出 ModbusIOException - 但它没有被捕获块捕获。在控制台中,我得到以下输出:

net.wimpi.modbus.ModbusIOException:读取失败 在 net.wimpi.modbus.io.ModbusTCPTransport.readResponse(ModbusTCPTransport.java:180) 在 net.wimpi.modbus.io.ModbusTCPTransaction.execute(ModbusTCPTransaction.java:193) 在 de.vksys.modbusclient.ModbusClient.getPlantState(ModbusClient.java:121) 在 de.vksys.modbusclient.ReconnectingModbusClient.main(ReconnectingModbusClient.java:36)

如果我单击带有 getPlantState 的行,Eclipse 会在上面的 try-block 中标记该行。但是为什么没有抓到呢?我还检查了 catch 块中 ModbusIOException 的全名,是一样的... net.wimpi.modbus.ModbusIOException。

任何想法,可能是什么原因?如果您需要更多代码来跟踪此问题,请告诉我。

提前致谢,
弗兰克

【问题讨论】:

  • 这个异常可能会在别处抛出,或者尝试保存您的文件?
  • 删除 e.printStackTrace();从您的 catch 块中查看结果

标签: java eclipse exception


【解决方案1】:

它确实捕获了异常。您刚刚打印了堆栈跟踪,这就是您在标准输出中看到的内容。

捕获异常并不意味着它不会维护堆栈跟踪,而处理异常意味着您需要对其进行编码,以便您可以从异常中恢复(这就是您的情况发生的情况,否则您的程序会执行到调用您的方法回滚堆栈的父方法,即在 readResponse 方法中)您可能会说好的事情发生或您重新抛出异常。例如给出如下代码:

void myMethod() {
    try {
         methodThatThrowsIOException();
    } catch (IOException ioe) {
         ioe.printStackTrace();
    }
    System.out.println("I will be printed");

如果你没有捕捉到异常,那么你永远不会执行像“我将被打印”这样的打印语句 }

【讨论】:

  • 他应该注意到程序继续运行并且没有崩溃。
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多