2013-07-10 37 views
-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更灵活一些。

+1

只在您的应用程序的* one *位置执行此操作。请参见http://www.oracle.com/technetwork/java/effective-exceptions-092345.html – artbristol

回答

0

从java 1.7中你可以将异常行为分组。

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

而且赶上这个功能并不会扔掉它只能是RuntimeException所有的异常和子类的原因,他们是unchecked异常。

而对于层次例外,首先是子类,然后是更一般的。

例如:

catch(EOFException e){ 

}catch(IOException e){ 

} 

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

+0

捕获泛型'Exception'不会包含'RuntimeException's? –

+0

@EricS是的,但是是一个不好的做法..你必须赶上不那么通用的例外.. :),你也有这个想法catch Throwable,会捕获错误和异常,但没有意义.. – nachokk

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

啊不坏,虽然我讨厌重复代码。投票但希望有一个更优雅的方式... –

+0

这并不是一件好事...抓住异常不是一个好的做法..如果doSomething不抛出异常,你不想赶上例外.. – nachokk

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){} 
0

由于EOFException类扩展IOException异常你可以赶上IOException异常,并把它作为下面

赶上(IOException异常E){// 做你想做的 }

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 
} 

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

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

相关问题