【问题标题】:Java: How to throw an Exception to the method caller inside a try catch body?Java:如何在 try catch 体内向方法调用者抛出异常?
【发布时间】:2010-10-01 20:59:06
【问题描述】:

当我有这样的方法时:

public static void foo(String param) throws IOException
{
    try
    {
         // some IOoperations
         if (param.isEmpty())
         {
              throw new IOException("param is empty");
         }
         // some other IOoperations

    } catch (Exception e) {
        /* handle some possible errors of of the IOoperations */
    }
}

当抛出 IOException ("param is empty") 时,它会被该主体中的 try-catch 捕获。但是这个异常是针对这个方法的调用者的。我怎样才能正确地做到这一点?有什么“纯Java”可以做到这一点,还是我必须创建一种不是 IOException 实例的其他类型的异常以避免 try-catch 主体处理它?

我知道你会建议在这种情况下使用IllegalArgumentException。但这是我的情况的一个简化示例。实际上抛出的异常 I 是一个 IOException。

谢谢

【问题讨论】:

    标签: java exception-handling try-catch


    【解决方案1】:

    制作您自己的IOException 的自定义子类可能是个好主意。不仅要解决这个问题,而且有时它对您的 API 用户来说有点“用户友好”。

    然后你可以在 catch 块中忽略它(立即重新抛出它)

    } catch (FooIOException e) {
        throw e;
    } catch (Exception e) {
        /* handle some possible errors of of the IOoperations */
    }
    

    【讨论】:

      【解决方案2】:

      我想我对你的例子的细节感到困惑——你为什么要宽泛

      } catch (Exception e) {
      

      如果没有那个过于通用的 catch 子句,你的问题就会消失。

      我误会了吗?

      【讨论】:

      • 同意。捕获 Exception 或 RuntimeException 很少是一个好主意。通常,您希望捕获更具体的子类。并且请永远不要捕获 Throwable 或 Error。
      【解决方案3】:

      您可以检查您的异常是否是IOException 的实例,如果是,请重新抛出它。

      catch( Exception e ) {
        if( e instanceof IOException ) {
          throw (IOException)e;
        }
      }
      

      【讨论】:

      • 他只是想处理IOException而不是手动抛出的。顺便说一句,在这种特殊情况下,我会添加另一个 catch 块而不是 instanceof
      • 谢谢,但是这个方法中抛出的所有异常都是 IOExceptions...(顺便说一句:恭喜你获得 10,000 分!)
      • 10,000 必须等到明天。今天已经达到了 200 的限制 :-(
      • 不是这个,比我好的答案太多了。
      【解决方案4】:

      您可以捕获它,然后重新抛出它,但正确的解决方案应该是对您在 catch 语句中捕获的内容更具选择性......

      例如。在下面的代码中,我捕获了一个 FileNotFoundException,因此将 IOException 抛出回调用方法。

      public static void foo(String param) throws IOException {
              try {
               // some IOoperations
               if (param.isEmpty())
               {
                    throw new IOException("param is empty");
               }
               // some other IOoperations
      
              } catch (FileNotFoundException e) {
                  /* handle some possible errors of of the IOoperations */
              }
          }
      

      【讨论】:

        【解决方案5】:

        我会创建一个IOException 的子类。这将允许您使用 instanceof 检查并重新抛出。

        而且我使用catch (Exception) 的情况很少。捕获特定异常几乎总是更好。唯一不这样做的原因是当您想要聚合异常并重新抛出时(反射操作是执行此操作的常见地方)。

        【讨论】:

          【解决方案6】:

          如果 IOExceptions 用于 foo() 调用者,您可以这样做:

          public static void foo(String param) throws IOException
          {
              try
              {
                   // some IOoperations
                   if (param.isEmpty())
                   {
                        throw new IOException("param is empty");
                   }
                   // some other IOoperations
          
              } catch (IOException e) {
                  throw e;
              } catch (Exception e) {
                  /* handle some possible errors of of the IOoperations */
              }
          
          }
          

          如果您的异常是唯一真正需要重新抛出的异常,则创建一个新的 IOException 子类型,将其命名为 MyException 并尝试捕获 MyException 以重新抛出它。

          任何 pokemon 异常处理都非常难看!

          【讨论】:

          • 恭喜获得 10k。 46天;我认为这是一个新记录:)
          • @NullUserException,谢谢 :)
          猜你喜欢
          • 1970-01-01
          • 2013-01-01
          • 2020-12-16
          • 2011-03-28
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多