【问题标题】:How to know what exact function throws exception (Java)?如何知道确切的函数抛出异常(Java)?
【发布时间】:2012-02-07 00:03:18
【问题描述】:

我有两个函数(ServerSocket.accept()Socket.setSoTimeOut())分别抛出 IOException 和扩展 IOException 的 SocketException。

如果我捕获 IOException,我如何知道哪个函数抛出了这个异常? 我应该在单独的 try/catch 块上调用这些函数吗?还是有更合适的方法来做到这一点?

【问题讨论】:

  • 堆栈跟踪将显示罪魁祸首。如果您捕获并记录,请使用带有 Exception/Throwable 参数的记录方法。
  • 哎呀......我可以通过抓住他们两个来做到这一点!但是继承人应该是第一位的。我不知道订单是效果..
  • 通常,从不catch (IOException e) { /* nothing */ }。唯一可以接受什么都不做的情况是,当您知道异常永远不会发生时(使用反射时会发生这种情况),即便如此,最好还是重新抛出 RuntimeException 以防万一。
  • 我不想在日志中看到..我想关闭套接字并继续运行..

标签: java exception ioexception


【解决方案1】:

如果有两个 catch 块,一个用于 SocketException,另一个用于 IOException。然后,您可以通过执行的 catch 块判断哪个方法调用失败。

注意:SocketException 的 catch 块应该首先出现,这样代码才能有效并编译。

【讨论】:

  • 嗨.. 如果 bot 函数抛出 IOException ex。有办法找出抛出的函数是什么?
  • 在这种情况下,我认为您可能需要检查异常对象本身,或者可能对每个方法都有单独的 try 块。出于兴趣,为什么需要这样做?可能还有其他优雅的方式来完成您正在尝试做的事情。
  • 另外,Socket.setSoTimeOut() 会抛出一个实际的 IOException 吗?我怀疑这是一种可能的情况。
  • 实际上,我对此并没有什么兴趣。但我一般问,我是否有两个函数抛出相同的异常对象,我怎样才能找出哪个函数导致异常。你有没有告诉任何关于检查物体本身的事情?......你的意思是什么?我该怎么做?
  • 对于上述问题中的问题,两个单独的 catch 块就足够了,但一般来说,如果两个方法抛出完全相同的异常,想到的解决方案是方法 exception.getStackTrace() 和遍历堆栈元素。但这是相当肮脏的,在正常实践中不应该这样做。重构代码并以不同方式实现目标应该足以更优雅地满足您的需求。
【解决方案2】:

使用 Exception 对象的 getStackTrace() 方法。

【讨论】:

    【解决方案3】:

    我会将问题恢复为“如果哪个方法调用引发异常,我是否需要运行单独的逻辑”?如果答案是肯定的,那么确实需要两个try / catch 块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-07
      • 2021-09-03
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      相关资源
      最近更新 更多