有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何捕获函数尚未抛出的所有异常?

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

假设我有一个功能:

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合规性中完成的。我知道Java7让Try/Catch变得更灵活了


共 (5) 个答案

  1. # 1 楼答案

    try {
        doSomething(a, b);
    } catch (IOException e) {
        throw e;
    } catch (EOFException e) {
        throw e;
    } catch (Exception e){
        doSomethingWithError(e);
    }
    
  2. # 2 楼答案

    在Java1.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){
    
     }
    

    顺便说一下,只捕获一次异常

  3. # 3 楼答案

    由于EOFEException扩展了IOException,所以可以捕获IOException并如下抛出它

    捕获(IOE例外){ //做你想做的 }

  4. # 4 楼答案

    在java1之前。七,

    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){}
    
  5. # 5 楼答案

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

    这不是很好,但你的问题没有很多好的解决方案