【问题标题】:Android JavaMail API - Want to catch UnknownHostExceptionAndroid JavaMail API - 想要捕获 UnknownHostException
【发布时间】: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


【解决方案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
}

它按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多