Вопрос

Я использую Enerjy (http://www.enerjy.com/) инструмент статического анализа кода моего Java-кода.Он говорит мне, что следующая строка:

System.err.println("Эта база данных проигнорирована");

плохо, потому что он использует System.err.Точная ошибка:«JAVA0267 Использование System.err»

Что не так с использованием System.err?

Это было полезно?

Решение

Короткий ответ:Использование его для целей журналирования считается плохой практикой.

Это наблюдение, что в старые времена, когда не было широко доступных/принятых систем ведения журналов, все использовали System.err для вывода сообщений об ошибках и вывода трассировок на консоль.Этот подход может быть уместен на этапе разработки и локального тестирования, но не подходит для производственной среды, поскольку вы можете потерять важные сообщения об ошибках.По этой причине сегодня почти во всех инструментах статического анализа такой код обнаруживается и помечается как плохая практика (или проблема с аналогичным названием).

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

Самый очевидный (и свободный от внешних зависимостей) взломать Решение состоит в том, чтобы использовать встроенную среду ведения журнала Java через java.util.logging.Logger class, поскольку он по умолчанию пересылает события регистрации на консоль.Например:

final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);

(или вы можете просто отключить эту опцию анализа)

Другие советы

дескриптор вашей ошибки:

Использование System.err может указывать на остаточный отладочный или шаблонный код.Рассмотрите возможность использования полнофункционального пакета журнала, такого как Apache Commons для обработки регистрации ошибок.

Кажется, вы используете System.err для целей ведения журнала, что неоптимально по нескольким причинам:

  • невозможно включить ведение журнала во время выполнения без изменения двоичного файла приложения
  • поведением ведения журнала нельзя управлять путем редактирования файла конфигурации
  • вероятно, многие другие

Хотя я согласен с приведенными выше пунктами об использовании системы ведения журналов, я все же склонен использовать System.err вывод в одном месте:В пределах крючков отключения.Это потому, что я обнаружил, что при использовании java.util.logging Операторы журнала платформы не всегда отображаются, если они происходят в перехватчиках завершения работы.Это связано с тем, что библиотека журналирования, по-видимому, содержит собственный перехватчик завершения работы для очистки файлов журналов и других ресурсов, и поскольку вы не можете полагаться на порядок, в котором выполняются перехватчики завершения работы, вы не можете полагаться на java.util.logging утверждения работают так, как ожидалось.

Подробнее об этом можно узнать по этой ссылке (раздел «Комментарии»).

http://weblogs.java.net/blog/dwalend/archive/2004/05/shutdown_hooks_2.html

(Очевидно, что другой альтернативой является использование другой структуры журналирования.)

System.err на самом деле больше предназначен для отладки, чем для чего-либо еще.Предпочтительна правильная обработка исключений и устранение ошибок более удобным для пользователя способом.Если пользователь должен увидеть ошибку, используйте вместо этого System.out.println.

Если вы хотите отслеживать эти ошибки с точки зрения разработчика, вам следует использовать регистратор.

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

System.err и System.out для неконсольных приложений видны только разработчику, выполняющему код в своей IDE, и полезная информация может быть потеряна, если элемент запускается в рабочей среде.

System.err.println и System.out.println не следует использовать в качестве интерфейса ведения журнала.STD-Output и STD-Error (они записываются System.out и .err) предназначены для сообщений из инструментов командной строки.

System.err выводится на консоль.Это может подойти для учащихся, проверяющих домашнее задание, но не подойдет для приложения, в котором эти сообщения не будут видны (консоль хранит ограниченное количество строк).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top