2016-02-18 3 views
0

У меня есть вопрос о java.util.logging.Handler:Могут ли реализации исключений Runtime.publish() бросать исключения?

Является ли реализация этого абстрактного метода разрешенным RuntimeExceptions, или он должен всегда сообщать диспетчеру ошибок?

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

общественности аннотация недействительными публиковать (LogRecord запись) Публикация LogRecord. Запрос журнала был первоначально издан объекту Logger, который инициализировал LogRecord и перенаправил его здесь.

Обработчик несет ответственность за форматирование сообщения, когда и необходимо. Форматирование должно включать локализацию.

Параметры: запись - описание события журнала. Нулевая запись проигнорирована и не опубликована

[Ссылка: https://docs.oracle.com/javase/7/docs/api/java/util/logging/Handler.html#publish(java.util.logging.LogRecord)]

ответ

0

Это тот случай, когда API спецификация не всегда соответствует реализации. Неписанные правила из исходного кода выглядят следующим образом:

  1. Обработка нулевой записи может быть враждебной или игнорируемой. Подклассы StreamHandler ignore null и MemoryHandler is null hostile. Логгер никогда не передает null для публикации, поэтому на самом деле не важно, что вы выберете.
  2. Любое исключение из среды выполнения, исключенное из isLoggable, выйдет из обработчика. Это означает, что любое исключение, выбрасываемое из фильтра, ускользает от метода публикации и не попадает в ловушку диспетчера ошибок. Обратите внимание, что нет перечисления ErrorManager.FILTER_FAILURE, поэтому подразумевается, что поведение является преднамеренным.
  3. Исключения, которые публикация не должна указывать, перечислены в документации ErrorManager. Большинство случаев - это ошибки форматирования и записи.

Действительно публиковать должен делегировать менеджеру ошибок, чтобы определить, publish throws exceptions or not. Из документации Handler.setErrorManager:

Метод ошибки ErrorManager будет вызываться, если при использовании этого обработчика возникнут какие-либо ошибки.

Это означает, что публикация должна подчиняться поведению диспетчера ошибок, который по умолчанию не выбрасывает.

Если вы хотите получить исключение через Handler.reportError, вы должны использовать скрытый бросок.

public class HostileErrorManager extends ErrorManager { 

    @Override 
    public void error(String msg, Exception ex, int code) { 
     sneakyThrow(new Throwable(msg + ": " + code, ex)); 
    } 

    @SuppressWarnings("unchecked") 
    private <T extends RuntimeException> void sneakyThrow(Throwable t) throws T { 
     throw (T) t; 
    } 
} 
Смежные вопросы