我使用Android JavaMail-API发送电子邮件。一切都按预期工作,但现在我正在测试一些事情,当我有一个糟糕的互联网连接。我通过禁用WIFI来完成此操作,然后单击“发送电子邮件”按钮。Android JavaMail API - 想赶上UnknownHostException
在我的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被逮住因为我们没有互联网连接,所以使用该catch内的代码。
结果是什么而不是:
- 例外是钓到与以下错误堆栈跟踪:
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:Host is 未解决:smtp.gmail.com 07-02 15:00:47.699:W/System.err(6680):at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1389) 07-02 15:00:47.709:W/System.err(6680):at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) 07-02 15:00:47.709:W/System.err (6680):at javax.mail.Service.connect(Service.java:310)07-02 15:00:47.709: W/System.err(6680):at javax.mail.Service.connect(Service。 java:169) 07-02 15:00:47.709:W/System.err(6680):at javax.mail.Service.connect(Service.j ava:118)07-02 15:00:47.709: W/System.err(6680):at javax.mail.Transport.send0(Transport.java:188) 07-02 15:00:47.709:W/System.err(6680):at javax.mail.Transport.send(Transport.java:118)07-02 15:00:47.719: W/System.err(6680):at external_software.JavaMailAPI.send( JavaMailAPI.java:118)07-02 15:00:47.719:W/System.err(6680):at controllers.EMailSender.SendEmails(EMailSender.java:58)07-02 15:00:47.719:W /System.err(6680): at activities.ChecklistResultActivity $ 3.run(ChecklistResultActivity.java:300) 07-02 15:00:47.719:W/System.err(6680):at java.lang.Thread。运行(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):at java.net.Socket.connect(Socket.java:786)07-02 15:00 :47.729:W/System.err(6680):at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233) 07-02 15:00:47.729:W/System.err(6680) :at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:163) 07-02 15:00:47.729:W/System.err(6680):at com.sun.mail.smtp。 SMTPTransport.openServer(SMTPTransport.java:1359) 07-02 15:00:47.729:W/System.err(6680):...10更多
并使用其他catch中的代码。
正如您所看到的,它捕获了JavaMail-API的MessagingException,它嵌套了UnknownHostException。
那么,我该如何捕获嵌套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赶上呢?或者我应该使用重复的代码(然后我会为它创建一个私有方法)。因此,而不是'抛出新的UnknownHostException(ex.getMessage());'我使用'//在没有Internet连接时再次执行某些操作。关于双'getCause()',我刚刚在链接中找到了。我只是查看了JavaMail-API,他们有一个'ex.getNextException()'方法,所以我不如使用'getCause()'来代替。 –
你是如何解决这个问题的? –