Handler.publish()的实现可以抛出运行时异常吗?

时间:2016-02-18 21:48:05

标签: java java.util.logging

我有一个关于java.util.logging.Handler的问题:

是否允许此抽象方法的实现抛出RuntimeExceptions,还是应该始终向错误管理器报告?

文档没有指定,但是类中的其他方法明确说明了它们可以抛出的内容:

  

public abstract void publish(LogRecord record)发布LogRecord。   日志记录请求最初是针对Logger对象进行的   初始化LogRecord并将其转发到此处。

     

处理程序负责格式化消息,何时以及是否   必要。格式应包括本地化。

     

参数:record - 日志事件的描述。空记录是   默默地忽略并且没有发表

[链接:https://docs.oracle.com/javase/7/docs/api/java/util/logging/Handler.html#publish(java.util.logging.LogRecord)]

1 个答案:

答案 0 :(得分:0)

这种情况下API规范并不总是与实现相匹配。来自源代码的未经编写的规则似乎是:

  1. 处理空记录可能是敌对的或被忽略的。 StreamHandler ignore nullMemoryHandler is null hostile的子类。记录器从不传递null以进行发布,因此您选择的内容并不重要。
  2. 从isLoggable抛出的任何运行时异常都将逃避Handler。这意味着从过滤器抛出的任何异常都会转义发布方法,并且不会被错误管理器捕获。请注意,没有枚举ErrorManager.FILTER_FAILURE,这意味着行为是故意的。
  3. 在ErrorManager文档中枚举了不应抛出发布的异常。大多数情况都是格式化和写错误。
  4. 真正发布应委托给错误管理器以确定是否publish throws exceptions or not。来自Handler.setErrorManager文档:

      

    如果在使用此处理程序时发生任何错误,将调用ErrorManager的“error”方法。

    这意味着发布应该遵循错误管理器的行为,默认情况下不会抛出。

    如果你想通过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;
        }
    }