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


105

在Java中,有什么方法可以全部获取(捕获)exceptions而不是单独捕获异常?


2
我将使用catch(Exception e){}来捕获所有这些特定的Exception?
约翰娜

是的 由于Exception是所有异常的基类,因此它将捕获任何异常。
jjnguy

1
// @ jjnguy:谢谢你的好解释。
约翰娜

我很高兴这很有帮助。
jjnguy

Answers:


111

如果需要,可以在方法中添加throws子句。然后,您不必立即捕获已检查的方法。这样一来,您可以赶上exceptions后面的内容(也许与other同时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){
}

95

虽然我同意捕获原始异常不是一种好的样式,但是有一些处理异常的方法可以提供出色的日志记录,并具有处理意外事件的能力。由于您处于异常状态,因此与获取响应时间相比,您可能更感兴趣于获取良好的信息,因此,instanceof性能不会受到太大的影响。

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;
    }
}

12
为什么不使用多个捕获块?
卡尔G

1
我认为您应该明确地捕获每个异常,但是这个问题明确地询问如何捕获代码块将抛出的所有内容。
codethulhu 2014年

那可扔的东西很有用。
2014年

这是我一直在寻找的解决方案,我需要一个if if来进行异常处理。谢谢
CubeJockey

抛出小费确实有用。
cherryhitech

15

捕获基本异常“ Exception”

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

8
如果您编写此代码,则几乎可以肯定是做错了什么。
乔治,

2
@乔治为什么这么说?
kuchi 2013年

10
@George不一定,如果您处理的东西具有很多敏感的输入参数,并且验证每个参数的有效性非常复杂,那么一旦对工作用例进行了适当的测试,就可以捕获各种异常。 。与巨大且可能很沉重的条件相比,这将使代码更清晰,并且省去很多麻烦。
约翰里德(Johnride)

2
我使用过的大多数编码器都没有在catch语句中放置任何内容,因此使用此try catch片段实际上比捕获一堆不同的异常类型更好,并且不对其进行任何处理
Lou Morda 2015年

1
@LouisMorda我不同意,捕获每个Exception子类并且不基于它们做任何事情(忽略它们)比仅捕获某些特定的异常并忽略它们更糟糕。如果您捕获某些Exception类型并且不对信息进行任何操作,则您将没有机会知道在这些情况下出了什么问题,但是,如果您捕获了所有Exception子类,则您将无从得知大量出了什么问题的机会。的情况。考虑在没有异常信息(如堆栈跟踪和消息)的情况下如何处理错误报告。
zpon

6

捕获Exception是一个不好的做法-它太广泛了,您可能会在自己的代码中错过NullPointerException之类的东西。

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


1
捕获异常是不好的做法。为什么?糟糕的解释
Pedro Sequeira

4

就在这里。

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


3

您的意思是捕获Exception任何引发的类型,而不是特定的Exception?

如果是这样的话:

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

对于非特定的我该怎么办?
约翰娜

我将使用catch(Exception e){}来捕获所有这些特定的Exception?
约翰娜
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.