Почему строки ошибок исключения отличаются в разных средах? - PullRequest
3 голосов
/ 05 ноября 2010

У меня есть этот фрагмент кода, чтобы справиться с перехватом определенных исключений

private static final String CONNECTION_REFUSED_EXCEPTION = "java.net.ConnectException: Connection refused: connect";
...
} catch (org.apache.axis.AxisFault af) {

            if (af.getFaultString().equals(CONNECTION_REFUSED_EXCEPTION))
            {
               // Do something
            }
}

Это прекрасно работает локально в моей среде разработки Windows

Однако при развертывании на машине Unix для тестированиястрока ошибки отличается, как показано ниже (обратите внимание на: отсутствует соединение с конца)

  • Строка ошибки Windows: java.net.ConnectException: соединение отклонено: connect
  • Ошибка Unixstring: java.net.ConnectException: в соединении отказано

Почему это так?

Для записи, я считаю, что для сопоставления строки ошибки лучше подойдет следующее:

...
if(af.getCause() instanceof java.net.ConnectException)
...

Ответы [ 4 ]

4 голосов
/ 05 ноября 2010

Сообщения «строка ошибки» предназначены для предоставления дополнительной информации в целях отладки. Они могут различаться в разных реализациях, версиях или средах. То же самое относится в целом ко всем строкам сообщений об исключениях (Throwable.getMessage()).

Код приложения должен , а не полагаться на точный текст сообщений об исключении, чтобы определить причину исключения. Ваше предложение использовать instanceof вместо проверки причины исключения является гораздо лучшим решением.

Edit:

Если вам абсолютно необходимо проверить подробное сообщение, как это, кажется, происходит в вашем случае (поскольку getCause() возвращает null), то я бы порекомендовал проверить, содержит ли подробное сообщение имя конкретного переноса Исключение, которое вы проверяете (например, java.net.ConnectException). В конце концов, это та же самая информация, которую вы получили бы, если бы getCause() не возвращал null в первую очередь, и должны минимизировать зависимости с точным текстом подробного сообщения.

3 голосов
/ 05 ноября 2010

Многие причины:

  1. Сообщение об исключении Строки не стандартизированы.
  2. Некоторые сообщения об исключении включают в себя сообщения, предоставляемые операционной системой хоста.Скорее всего, они будут отличаться в разных ОС, и Java мало что может с этим поделать.
  3. Сообщения об исключениях, исходящие из Java, могут быть изменены из одной версии в другую, чтобы уточнить их значение и т. Д.
  4. Некоторые сообщения об исключениях, исходящие из Java, могут зависеть от локали.(Я не думаю, что это применимо к стандартным библиотекам классов, но я могу ошибаться.)

В целом, для кода восстановления приложения не рекомендуется полагаться на конкретное исключениестроки сообщения.Если вы обнаружите, что у вас нет выбора, убедитесь, что вы внедрили код, содержащий строковые зависимости сообщения, в класс плагина (или аналогичный), чтобы вы могли легко выбрать другую версию для разных платформ ОС, на которых работает ваше приложение.

0 голосов
/ 05 ноября 2010

Исходная строка ошибки (возможно?) Поступает из библиотеки осей Apache.Проверьте дважды, если вы используете одну и ту же версию библиотеки на обеих машинах (строки могут отличаться в зависимости от версии).Другая причина - «локализация».Некоторые строки ошибок локализованы и могут отличаться на машинах с разными настройками локали.Я бы тоже это проверил.

0 голосов
/ 05 ноября 2010

Что такое JVM в Windows и Unix? Если они не принадлежат одному поставщику (например, Sun), строка ошибки может немного отличаться.

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