【发布时间】:2014-07-02 13:28:28
【问题描述】:
我使用 Android JavaMail-API 发送电子邮件。一切都按预期工作,但现在当我的互联网连接不好时,我正在测试一些东西。我通过禁用 WIFI 然后点击发送电子邮件按钮来做到这一点。
在我的 SendMail 方法中,我有以下内容:
try{
if(javaMailAPI.send()){
// Do something on success
}
else{
// Do something on fail
}
}
catch(UnknownHostException ex){
// Do something when I have no Internet Connection
}
catch(Exception ex){
// Do something else when I have an other Exception
}
所以,当我在 WIFI 断开连接的情况下进行上述测试时,这就是我所期望的:
- UnknownHostException 被捕获,因为我们没有 Internet 连接,使用了该捕获中的代码。
结果是什么:
- 异常被捕获并出现以下错误 Stacktrace:
07-02 15:00:47.699: W/System.err(6680): javax.mail.MessagingException: 未知 SMTP 主机:smtp.gmail.com; 07-02 15:00:47.699: W/System.err(6680):嵌套异常是:07-02 15:00:47.699: W/System.err(6680): java.net.UnknownHostException: 主机是 未解决:smtp.gmail.com 07-02 15:00:47.699:W/System.err(6680):在 com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1389) 07-02 15:00:47.709: W/System.err(6680): 在 com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) 07-02 15:00:47.709: W/System.err(6680): 在 javax.mail.Service.connect(Service.java:310) 07-02 15:00:47.709: W/System.err(6680):在 javax.mail.Service.connect(Service.java:169) 07-02 15:00:47.709: W/System.err(6680): 在 javax.mail.Service.connect(Service.java:118) 07-02 15:00:47.709: W/System.err(6680):在 javax.mail.Transport.send0(Transport.java:188) 07-02 15:00:47.709: W/System.err(6680): 在 javax.mail.Transport.send(Transport.java:118) 07-02 15:00:47.719: W / System.err(6680):在 external_software.JavaMailAPI.send(JavaMailAPI.java:118) 07-02 15:00:47.719:W/System.err(6680):在 controllers.EMailSender.SendEmails(EMailSender.java:58) 07-02 15:00:47.719:W/System.err(6680):在 活动.ChecklistResultActivity$3.run(ChecklistResultActivity.java:300) 07-02 15:00:47.719: W/System.err(6680): 在 java.lang.Thread.run(Thread.java:841) 07-02 15:00:47.719: W/System.err(6680):引起:java.net.UnknownHostException:主机是 未解决:smtp.gmail.com 07-02 15:00:47.729:W/System.err(6680):在 java.net.Socket.connect(Socket.java:826) 07-02 15:00:47.729: W/System.err(6680):在 java.net.Socket.connect(Socket.java:786) 07-02 15:00:47.729:W/System.err(6680):在 com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233) 07-02 15:00:47.729: W/System.err(6680): 在 com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:163) 07-02 15:00:47.729: W/System.err(6680): 在 com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359) 07-02 15:00:47.729: W/System.err(6680): ... 10 更多
并且使用了另一个catch里面的代码。
如您所见,它捕获了嵌套 UnknownHostException 的 JavaMail-API 的 MessagingException。
那么,如何捕获嵌套 UnknownHostException 的 UnknownHostException / MessagingException?是否有可能以某种方式检索嵌套的异常?
我应该使用这个 (source):
...
catch(Exception ex){
if(ex.getCause() != null && ex.getCause().getCause() instanceof UnknownHostException){
throw new UnknownHostException(ex.getMessage());
}
else{
// Do something else when I have an other Exception
}
}
PS:当我像上面那样抛出 UnknownHostException 时,这会转到这个捕获的异常之上的 UnknownHostException 吗?
【问题讨论】:
-
您建议的代码将按照您的要求执行(不知道为什么您有两次
getCause()),并且您抛出的异常不会被上面的 catch 捕获。但是,由于互联网连接不可用可能会导致其他例外情况。 -
@DaveMorrissey 关于“不,您抛出的异常不会被上面的捕获捕获。”部分,我该如何去捕获 UnknownHostException 呢?或者我应该使用重复的代码(然后我会为它创建一个私有方法)。所以我不再使用
throw new UnknownHostException(ex.getMessage());,而是再次使用// Do something when I have no Internet Connection。关于双重getCause(),我刚刚在链接中找到了。我刚刚查看了 JavaMail-API,他们有一个方法ex.getNextException(),所以我不妨使用它而不是getCause()。 -
你是如何解决这个问题的?
标签: java android exception nested jakarta-mail