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
}