如何捕获函数尚未引发的所有异常?

时间:2013-07-10 17:17:13

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

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

说我有一个功能:

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更加灵活。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

从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){

 }

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

答案 2 :(得分:0)

在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 :(得分:0)

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

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

答案 4 :(得分:0)

根据其他答案,尤其是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
}

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

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