-2

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

说我有一个功能:

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

有没有办法告诉Java如何做到这一点?我知道为所有人抛出泛型Exception作品,但我想抛出除了抛出的异常之外的所有东西。

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

(PS——我知道,我知道所有可能的异常都需要单独处理的格言。就我的目的而言,我只想捕获错误,将它们记录到数据库中,然后看看会发生什么我们错过的事情开发。Exception当我的函数已经抛出 2 个异常时,我不愿意捕捉泛型)

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

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

4

5 回答 5

1
try {
    doSomething(a, b);
} catch (IOException e) {
    throw e;
} catch (EOFException e) {
    throw e;
} catch (Exception e){
    doSomethingWithError(e);
}
于 2013-07-10T17:20:09.193 回答
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){

 }

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

于 2013-07-10T17:19:08.417 回答
0

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

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

于 2013-07-10T17:29:16.060 回答
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){}
于 2013-07-10T17:20:11.180 回答
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
}

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

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

于 2013-07-10T17:56:50.647 回答