1

我是这里的 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();
    }

然后我的捕获代码突然运行了。

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

以防万一,我总是能捕捉到一个普遍的例外吗?

4

2 回答 2

2

所有异常都是该类的子Exception类。所以,你所做的就是说,“如果AddressException发生了,就这样处理;如果MessagingException发生了,就这样处理;对于任何其他Exception的,这样处理。”

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

于 2013-08-08T12:15:15.423 回答
1

抓住将军 Exception总是有可能的,尽管通常不是一个好习惯。
很多时候,组件无法处理异常,捕获它真的没有意义,“上层”应该处理它。

它还可能会产生安全风险(您不想显示程序中出了什么问题,而是将其记录下来并发送给开发团队)。

笔记:

  1. 捕获Exception将捕获所有正在扩展的异常Exception,但它不会捕获所有Throwables(如Error)。
  2. 在您的代码中,如果catch块本身抛出异常会发生什么?通常异常处理应该非常少,在你的情况下,我会在检查是否可以发送带有附件的邮件之前尝试验证,而不仅仅是异常(如果可以的话)。
  3. 捕获多种“类型”的异常是没有意义的,最后Exception如果处理相同,Exception在这种情况下只捕获没有其余的。
于 2013-08-08T12:18:14.303 回答