Java 如何捕获所有非';函数是否已抛出?

Java 如何捕获所有非';函数是否已抛出?,java,exception,exception-handling,try-catch,throw,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); }

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

假设我有一个函数:

public int func(int a, int b) throws IOException, EOFException {
    try {
        doSomething(a, b);
    } catch (AllExceptionsExceptionIOandEOF e) {
        doSomethingWithError(e);
    }
    return 0;
}
有没有办法告诉Java如何做到这一点?我知道抛出泛型
异常
对所有人都有效,但我想抛出除抛出异常以外的所有异常

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

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

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

try {
    doSomething(a, b);
} catch (AllExceptionsExceptionIOandEOF e) {
    doSomethingWithError(e);
    if (e instanceof IOException)
        throw e;
    if (e instanceof EOFException)
        throw e;
}
但是有没有更优雅的方法呢


编辑-不幸的是,该项目是在Java6法规遵从性中完成的。不过,我知道Java7使Try/catch更加灵活

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

 }
顺便说一下,在java1.7之前的版本中,只捕获一次异常。

try {
    doSomething(a, b);
} catch (IOException e) {
    throw e;
} catch (EOFException e) {
    throw e;
} catch (Exception e){
    doSomethingWithError(e);
}
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){}

由于EOFEException扩展了IOException,您可以捕获IOException并按如下方式抛出它

捕获(IOE异常){ //做你想做的
}

根据其他答案,特别是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;
      }
    }
  }
}
这将重新抛出请求的异常,并且您有一个vararg列表,其中列出了每个异常块要重新抛出的异常。您可以重复使用它,并且只向每个异常块添加一行。您可以根据需要调整逻辑,以记录未处理的异常或其他任何需要的内容


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

不错,尽管我讨厌重复代码。投票,但希望有一个更优雅的方式…这一点都不好。。。捕获异常不是一个好的做法。。如果doSomething没有抛出异常,您就不想捕获异常。捕获泛型
异常
也不会包括
运行时异常
s?@EricS是的,但这是一种不好的做法。。您必须捕获不太通用的异常..:),您还可以使用catch-Throwable来捕获错误和异常,但没有意义。只在应用程序中的一个位置执行此操作。看见
try
{ ... }
catch (Exception e)
{
  ExceptionHandler.handle(e, IOException.class, EOFException.class);
  // other processing
}