Java:抓住一般例外,以防万一?

时间:2013-08-08 12:10:07

标签: java exception-handling try-catch

我是Java新手,所以我只是在这里工作时猜测。

我有一些代码

    try {
        sendMailWithAttachment(); 

    } catch (AddressException e) {

        e.printStackTrace();
        sendMailWithoutAttachment();

    } catch (MessagingException e) {

        e.printStackTrace();
        sendMailWithoutAttachment();
    } 

但是“catch”代码从未被执行过,所以我怀疑还有另一种类型的异常,我没有抓住,而不是猜测它是什么,我决定抓住一些“一般”的异常,我盲目地试过这个

    try {
        sendMailWithAttachment 

    } catch (AddressException e) {

        e.printStackTrace();
        sendMailWithoutAttachment();

    } catch (MessagingException e) {

        e.printStackTrace();
        sendMailWithoutAttachment();
    }  catch (Exception e) {
        e.printStackTrace();
        sendMailWithoutAttachment();
    }

然后我的捕捉代码突然跑了。

我在这里做了什么,最重要的是:

为了以防万一,我是否可以随时捕获一般异常?

2 个答案:

答案 0 :(得分:2)

所有异常都是Exception类的子类。所以,你所做的就是说,“如果AddressException发生,请按照这样处理;如果MessagingException发生,请按照这样处理;对于任何其他Exception,请像处理它一样处理它此“。

在您的情况下,所有三个catch块都是相同的,因此您只能使用catch (Exception e) { ... }块,但这被视为编码不佳。通常,您应该知道代码可能抛出哪些异常并适当地处理每个异常。

答案 1 :(得分:1)

总是可以捕捉一般 Exception,但通常不是一个好习惯。 很多时候,一个组件无法处理异常,并且抓住它确实没有意义,“上层”应该处理它。

它也可能会产生安全风险(您不希望显示程序中出现的问题,而是将其记录下来并发送给开发团队)。

注意:

  1. 捕获Exception将捕获正在扩展Exception的所有例外,但它不会捕获所有Throwable(例如Error
  2. 在您的代码中,如果catch块本身抛出异常会发生什么?通常,异常处理应该非常小,在您的情况下,我会在检查之前是否尝试验证是否可以发送带附件的邮件,而不仅仅是异常(如果可以的话)。
  3. 捕获多个“类型”异常并没有意义,如果处理相同,最后只能使用Exception,在这种情况下只需捕获Exception而没有其余部分。