【问题标题】:How to catch all exceptions that aren't already thrown by function?如何捕获函数尚未抛出的所有异常?
【发布时间】:2013-07-10 17:17:13
【问题描述】:

我有点怀疑这是否可行,但获得更多关于这方面的信息会非常有帮助。我想知道如何捕获函数尚未抛出的所有异常。

假设我有一个函数:

public int func(int a, int b) throws IOException, EOFException {
    try {
        doSomething(a, b);
    } catch (AllExceptionsExceptionIOandEOF e) {
        doSomethingWithError(e);
    }
    return 0;
}

有没有办法告诉 Java 如何做到这一点?我知道抛出通用的 Exception 对所有人都有效,但我想抛出除了抛出的异常之外的所有东西。

如果这被认为是不好的做法,为什么?什么是实现相同目标的好选择?

(PS -- 我知道,我知道所有可能的异常都需要单独处理的格言。为了我的目的,我只想捕获错误,将它们记录到数据库中,然后看看会发生什么我们在开发过程中错过了。当我的函数已经抛出 2 个异常时,我不愿意捕获通用 Exception

我突然想到,一种方法是说:

try {
    doSomething(a, b);
} catch (AllExceptionsExceptionIOandEOF e) {
    doSomethingWithError(e);
    if (e instanceof IOException)
        throw e;
    if (e instanceof EOFException)
        throw e;
}

有没有更优雅的方式来做到这一点?

编辑 - 不幸的是,该项目是在 Java 6 合规性下完成的。我知道 Java 7 使 Try/Catches 更加灵活。

【问题讨论】:

标签: java exception exception-handling try-catch throw


【解决方案1】:
try {
    doSomething(a, b);
} catch (IOException e) {
    throw e;
} catch (EOFException e) {
    throw e;
} catch (Exception e){
    doSomethingWithError(e);
}

【讨论】:

  • 不错不错,虽然我讨厌重复代码。投票但希望有更优雅的方式......
  • 那一点都不好...捕获异常不是一个好习惯..如果doSomething不抛出异常你不想捕获异常..
【解决方案2】:

在java1.7之前

try{}
catch(FileNotFoundException e){}
catch(IOException e){}
catch(Exception e){
    //anything not handled in other catch clause
}

请务必从更具体到更具体地声明您的 catch 子句。

在 java 1.7 中你可以做一些更有趣的事情:

catch(IOException | EOFException e){}

【讨论】:

    【解决方案3】:

    由于 EOFException 扩展了 IOException,您可以捕获 IOException 并将其抛出如下

    catch(IOException e){ //做你想做的 }

    【讨论】:

      【解决方案4】:

      从 java 1.7 开始,您可以对异常行为进行分组。

      try{
            //some code
      }catch( IOException | AnotherException e){
        //do what you want
      }catch(RuntimeException re){
          //happen a runtimexception 
      }
      

      并且要捕获函数不会抛出的所有异常,只能是 RuntimeException 和子类,因为它们是未经检查的异常。

      对于层次异常,首先是子类,然后是更一般的。

      例如:

       catch(EOFException e){
      
       }catch(IOException e){
      
       }
      

      顺便说一下,只捕获一次异常。

      【讨论】:

      • 捕获通用的Exception 不会也包括RuntimeExceptions?
      • @EricS 是的,但这是一种不好的做法.. 你必须捕获不太通用的异常.. :) ,你也可以用这个想法来捕获 Throwable ,它会捕获错误和异常,但没有任何意义。 .
      【解决方案5】:

      根据其他答案,尤其是 Java 1.7 之前的版本,您没有一个很好的答案。如果这将在您的代码中的许多地方完成,并且您主要希望它用于开发,我可能会建议创建一个特殊的处理程序:

      class ExceptionHandler
      {
        public static void handle(Throwable t, Class<? extends Exception> rethrowClasses...)
        {
          for (Class e : rethrowClasses)
          {
            if e.isInstance(t)
            {
               throw t;
            }
          }
        }
      }
      

      然后在你的异常块中:

      try
      { ... }
      catch (Exception e)
      {
        ExceptionHandler.handle(e, IOException.class, EOFException.class);
        // other processing
      }
      

      这将重新引发请求的异常,并且您有一个可变参数列表,其中列出了每个异常块要重新引发的异常。您可以重复使用它,并且只在每个异常块中添加一行。您可以根据需要调整逻辑以记录未处理的异常,或任何其他需要。

      这不是很好,但是对于您的问题没有很多好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        相关资源
        最近更新 更多