我有点怀疑这是可能的,但获得更多相关信息将非常有帮助。我想知道如何捕获函数尚未抛出的所有异常。
说我有一个功能:
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更加灵活。
答案 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列表,其中列出了为每个异常块重新抛出的异常。您可以重复使用它,并且只为每个异常块添加一行。您可以根据需要调整逻辑,以记录未处理的异常,或其他任何需要的异常。
这不是很好,但是你的问题没有很多好的解决方案。