2014-07-02 39 views
1

我使用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高于这个逮住例外?

+0

你所建议的代码将完成你所要求的操作(不知道为什么你有'getCause()'两次),并且你抛出的异常不会被上面的catch捕获。但是,可能会有其他例外,可能是由于互联网连接不可用造成的。 –

+0

@DaveMorrissey关于“不要抛出你抛出的异常不会被上面的捕获抓住。”部分,我怎么去UnknownHostException赶上呢?或者我应该使用重复的代码(然后我会为它创建一个私有方法)。因此,而不是'抛出新的UnknownHostException(ex.getMessage());'我使用'//在没有Internet连接时再次执行某些操作。关于双'getCause()',我刚刚在链接中找到了。我只是查看了JavaMail-API,他们有一个'ex.getNextException()'方法,所以我不如使用'getCause()'来代替。 –

+0

你是如何解决这个问题的? –

回答

1

我已经改变了这一点:

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 
} 

这样:

try{ 
    if(javaMailAPI.send()){ 
     // Do something on success 
    } 
    else{ 
     // Do something on fail 
    } 
} 
catch(UnknownHostException ex){ 
    onNoConnection(); 
} 
catch(Exception ex){ 
    // Check if the thrown Exception is a MessagingException with a nested UnknownHostException 
    if(ex instanceof MessagingException){ 
     if(((MessagingException)ex).getNextException() instanceof UnknownHostException){ 
      onNoConnection(); 
     } 
    } 
    else{ 
     // Do something else when I have an other Exception 
    } 
} 

private void onNoConnection(){ 
    // Do something when I have no Internet Connection 
} 

它按预期工作。