我是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();
}
然后我的捕捉代码突然跑了。
我在这里做了什么,最重要的是:
为了以防万一,我是否可以随时捕获一般异常?
答案 0 :(得分:2)
所有异常都是Exception
类的子类。所以,你所做的就是说,“如果AddressException
发生,请按照这样处理;如果MessagingException
发生,请按照这样处理;对于任何其他Exception
,请像处理它一样处理它此“。
在您的情况下,所有三个catch
块都是相同的,因此您只能使用catch (Exception e) { ... }
块,但这被视为编码不佳。通常,您应该知道代码可能抛出哪些异常并适当地处理每个异常。
答案 1 :(得分:1)
总是可以捕捉一般 Exception
,但通常不是一个好习惯。
很多时候,一个组件无法处理异常,并且抓住它确实没有意义,“上层”应该处理它。
它也可能会产生安全风险(您不希望显示程序中出现的问题,而是将其记录下来并发送给开发团队)。
注意:
Exception
将捕获正在扩展Exception
的所有例外,但它不会捕获所有Throwable
(例如Error
) catch
块本身抛出异常会发生什么?通常,异常处理应该非常小,在您的情况下,我会在检查之前是否尝试验证是否可以发送带附件的邮件,而不仅仅是异常(如果可以的话)。Exception
,在这种情况下只需捕获Exception
而没有其余部分。