当前位置: 首页 > 知识库问答 >
问题:

Android JavaMail API - 想要捕获 UnknownHostException

史良哲
2023-03-14

我使用 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 . messaging exception:未知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 . unknown Host exception:主机未解析:smtp.gmail.com 07-02 15:00:47.699:W/system . err(6680):at com . sun . mail . SMTP . SMTP transport . open server(SMTP transportjavamailapi . send(javamailapi . Java:118)07-02 15:00:47.719:W/system . err(6680):at控制器。email sender . send emails(email sender . 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 . 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...还有10个

并使用另一个捕获中的代码。

正如您所看到的,它捕获了JavaMail-API的MessagingException,它嵌套了UnknownHostException。

那么,我如何才能捕获嵌套Un

我应该使用这个(来源):

...
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:当我像上面一样抛出未知主机异常时,这个异常会转到这个捕获的异常上面的未知主机异常吗?

共有1个答案

艾焱
2023-03-14

我改变了这一点:

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
}

它按预期工作。

 类似资料:
  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 我的RMI服务器接口声明了一个方法foo(),该方法被声明为引发RemoteException和Exception,如下所示: 服务器实现为: 我的客户端在服务器上调用foo: 现在,当我运行客户端时,我得到: 从java类型的foo()中获取异常。rmi。异常异常:未声明的检查异常;嵌套的例外是:java。伊奥。InterruptedIOException:操作超时 Java文档是这样说的。rm

  • 问题内容: Java新手问题: 我需要捕获由第三方组件写入printStream的文本。 PrintStream默认为System.err,但可以更改为另一个PrintStream。 查看文档,我找不到将PrintStream的内容定向到字符串编写器/缓冲区的简单方法。 有人可以帮忙吗? 问题答案:

  • 问题内容: 在有效的Java(第275页)中,有以下代码段: 捕获中断异常以重新引发它有什么用?为什么不让它飞呢? 问题答案: 简单的答案是,这是一个检查的异常,它不在方法(或方法)的签名中。所以你必须抓住它。一旦发现它,建议您设置为设置中断标志。除非您确实打算压缩中断。

  • 问题内容: 我正在尝试编写一个函数wo,您可以通过argparse解析可变数量的参数- 我知道我可以通过做到这一点。可悲的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)使位置参数处于最后位置。这导致我的位置参数被视为可选参数的一部分。 运行它,如下面的用法说明所示: 但是如果我跑步给我 为了获得正确的参数解析,我必须运行 那么我该如何: 使argparse重新格式化用法

  • 问题内容: 最近,我们在Java服务器应用程序中遇到了一个问题,该应用程序正在抛出未捕获的错误,因为Error是Throwable的一个单独的子类,而我们仅捕获了Exceptions。 我们通过捕获Throwables而不是Exceptions解决了眼前的问题,但这使我思考为什么您要捕获Exceptions而不是Throwables,因为您随后会错过Errors。 那么, 当您可以捕获Throwa