Обработка исключения относительно его сообщения от getMessage () - PullRequest
0 голосов
/ 13 июля 2020

Является ли хорошей практикой обрабатывать исключение, связанное с его сообщением от getMessage () на платформе Android?

В моем приложении 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, иногда возникает следующее исключение:

javax. net .ssl.SSLHandshakeException : Рукопожатие SSL прервано: ssl = 0x7653281108: ошибка ввода-вывода во время системного вызова, сброс соединения одноранговым узлом

Это маловероятно, но может произойти при перезапуске сервера ... et c. Это уже случалось со мной во время тестирования более одного раза.

Итак, могу ли я использовать это сообщение и безопасно проверить, содержит ли оно строку « Сброс соединения партнером »? Или есть шанс, что сообщение от getMessage () будет на другом языке, отличном от английского sh?

Я пытался найти эту информацию, но нигде не нашел ... Я хочу быть уверен, что справиться с этим, как в этом примере, и успокоить мой разум - это нормально Я также попытался изменить язык на моем устройстве android на немецкий или чешский, и сообщение об исключении все еще было на английском sh, так что это хороший знак.

Обновление: Что касается ответа Стивена C, я изменил условие if на:

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

Это не так конкретно c в отношении исключения, но его более безопасно использовать.

1 Ответ

1 голос
/ 13 июля 2020

Нет, как правило, не рекомендуется, чтобы программа пыталась выделить строку сообщения в исключении.

Проблемы:

  • Строки исключения могут быть интернационализированы 1 . Правильный способ сделать это - переопределить Throwable.getLocalizedMessage, но также возможно интернационализировать первичное сообщение об исключении; например, перед созданием исключения. Последнее может вызвать проблемы при синтаксическом анализе сообщений.

  • Строки исключения могут изменяться с одной версии платформы Java (tm) или Android на другую. Вообще говоря, это не считается достаточно значительным изменением, чтобы отмечать его в примечаниях к выпуску и так далее. Таким образом, код, который анализирует сообщения об исключениях, может быть fr agile.

Лучшая идея - разработать иерархию исключений, чтобы вам не приходилось проанализировать сообщения:

  • Добавить подклассы исключений для случаев, которые обработчики должны различать guish.
  • Определить настраиваемые поля исключений для хранения значений, которые в противном случае обработчики могли бы извлечь .

Другой подход - избежать искушения делать необычные вещи. (В вашем примере, вам действительно нужно обрабатывать сбросы по-другому?)

Но, очевидно, когда этого требуют обстоятельства, вам все равно придется анализировать сообщения, несмотря на потенциальные проблемы.

1 - Существуют разные «школы мысли» о том, хорошая это идея или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...