如何捕获通过读取和写入文件而抛出的所有异常?

时间:2009-07-02 18:16:02

标签: java exception file exception-handling

在Java中,有没有办法获取(捕获)所有exceptions而不是单独捕获异常?

7 个答案:

答案 0 :(得分:102)

如果需要,可以在方法中添加throws子句。然后,您不必立即捕获已检查的方法。这样,您可以稍后捕获exceptions(可能与其他exceptions同时捕获。)

代码如下:

public void someMethode() throws SomeCheckedException {

    //  code

}

如果你不想用这种方法处理它们,你可以稍后处理exceptions

要捕获所有异常,可能会抛出一些代码块:(这也会抓住你自己编写的Exceptions

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

有效的原因是因为Exception是所有异常的基类。因此,可能抛出的任何异常都是Exception(大写'E')。

如果您想处理自己的异常,首先只需在通用例外版本之前添加catch块。

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

答案 1 :(得分:89)

虽然我同意捕获原始异常并不是一种好方法,但是有一些方法可以处理异常,这些异常提供了卓越的日志记录以及处理意外情况的能力。由于你处于一个特殊的状态,你可能对获得好的信息比对响应时间更感兴趣,所以性能的表现不应该是一个很大的打击。

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

但是,这并没有考虑IO也可以抛出错误的事实。错误不是例外。错误是与异常不同的继承层次结构,尽管它们共享基类Throwable。由于IO可以抛出错误,你可能想要抓住Throwable

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}

答案 2 :(得分:14)

捕获基本异常'异常'

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

答案 3 :(得分:5)

抓住例外是不好的做法 - 它太宽泛了,您可能会在自己的代码中遗漏像 NullPointerException 这样的内容。

对于大多数文件操作, IOException 是根异常。最好还是抓住它。

答案 4 :(得分:4)

是的。

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

答案 5 :(得分:2)

你的意思是抓住所引发的任何类型Exception,而不仅仅是特定的例外吗?

如果是这样的话:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

答案 6 :(得分:2)

您可以在单个catch块中捕获多个异常。

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
}