【问题标题】:Handle exception regarding its message from getMessage()处理来自 getMessage() 的消息异常
【发布时间】:2020-07-13 09:31:00
【问题描述】:

在 Android 平台上处理来自 getMessage() 的消息异常是否是一种好习惯?

在我的 android 应用程序中,我有以下类:

public class Test {

    boolean alreadyTried;

    public Test() {
        alreadyTried = false;
    }

    private void doTest() {

        try {
            downloadPictureFromServer(); //uses okhttp3

        } catch (Exception e) {

            if(e.getMessage() != null && e.getMessage().contains("Connection reset by peer")){
                //try again (only once)
                if(alreadyTried) {
                    Log.e("Test", "Connection reset by peer repeatedly, cannot communicate with the server");
                } else {
                    Log.e("Test", "Connection reset by peer, trying to communicate with the server again...");
                    alreadyTried = true;
                    doTest(); //try again
                }
                
            } else {
                throw e;
                
            }
        }
    }

}

doTest() 被调用时,它开始与运行在 Tomcat 服务器上的 Web 应用程序通信,有时会抛出以下异常:

javax.net.ssl.SSLHandshakeException:SSL 握手中止:ssl=0x7653281108:系统调用期间的 I/O 错误,对等方重置连接

这不太可能发生,但它可能会在服务器重新启动时发生......等等。我在测试期间已经发生了不止一次。

那么,我可以使用该消息并安全地检查它是否包含“Connection reset by peer”字符串吗?或者来自 getMessage() 的消息是否有可能使用与英语不同的语言?

我试图查找此信息,但我找不到任何地方...我想确保可以像本示例中那样处理它并让我的头脑平静下来。我还尝试将我的 android 设备中的语言更改为德语或捷克语,但异常消息仍然是英语,所以这是一个好兆头。

更新: 关于 Stephen C 的回答,我将 if 条件更改为:

if(e instanceof SSLHandshakeException) {
//try again (only once)
...
}

这对于异常没有那么具体,但使用起来更安全。

【问题讨论】:

    标签: java android android-studio exception


    【解决方案1】:

    不,程序尝试在异常中取消选择消息字符串通常不是一个好主意。

    问题:

    • 异常字符串可以国际化1。正确的做法是覆盖Throwable.getLocalizedMessage,但也可以将主要异常消息国际化;例如在构造异常之前。后者可能会给消息解析带来问题。

    • 异常字符串可能会从一个 Java(tm) 或 Android 平台版本更改为下一个。一般来说,这不被认为是一个足够显着的变化,无法在发行说明等中注明。所以解析异常消息的代码容易脆弱。

    一个更好的想法是设计异常层次结构,这样您就不需要解析消息:

    • 为处理程序需要区分的情况添加异常子类。
    • 定义自定义异常字段以保存处理程序可能不得不提取的值。

    另一种方法是避免诱惑去做花哨的事情。 (在您的示例中,您真的需要以不同的方式处理重置吗?)

    但显然,当情况需要时,尽管存在潜在问题,您仍可能不得不解析消息。


    1 - 关于它是否是一个好主意有不同的“思想流派”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2019-07-14
      • 2010-12-09
      • 2011-09-01
      • 2013-07-19
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多