Java 从getMessage()处理有关其消息的异常

Java 从getMessage()处理有关其消息的异常,java,android,android-studio,exception,Java,Android,Android Studio,Exception,在Android平台上处理来自getMessage()的异常消息是否是一种良好的做法 在我的android应用程序中,我有以下类: public class Test { boolean alreadyTried; public Test() { alreadyTried = false; } private void doTest() { try { downloadPictureFromServe

在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错误,对等方重置连接

这不太可能发生,但在服务器重新启动时可能发生。。。在测试过程中,我已经不止一次遇到过这种情况

那么,我可以使用该消息并安全地检查它是否包含“由对等方重置连接””字符串吗?或者getMessage()中的消息是否可能使用与英语不同的语言

我试图查找此信息,但我在任何地方都找不到。。。我想确定它是好的处理它像在这个例子中,并冷静我的头脑。我还尝试将android设备中的语言改为德语或捷克语,但异常信息仍然是英语,这是一个好迹象

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

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

关于异常,这并不是很具体,但使用起来更安全。

不,程序通常不想尝试取消选中异常中的消息字符串

问题:

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

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

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

  • 为处理程序需要区分的情况添加异常子类
  • 定义自定义异常字段以保存处理程序可能必须提取的值
另一种方法是避免做花哨事情的诱惑。(在您的示例中,您真的需要以不同的方式处理重置吗?)

但显然,当环境需要时,尽管存在潜在的问题,您可能还是必须解析消息


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