Java Handler.publish()的实现能否引发运行时异常?

Java Handler.publish()的实现能否引发运行时异常?,java,java.util.logging,Java,Java.util.logging,我有一个关于java.util.logging.Handler的问题: 这个抽象方法的实现是否允许抛出RuntimeException,还是应该始终向错误管理器报告 文档没有指定,但类中的其他方法明确说明了它们可以抛出什么: 公共摘要无效发布(LogRecord记录)发布日志记录。 日志记录请求最初是向记录器对象发出的,该记录器对象 初始化日志记录并将其转发到此处 处理程序负责设置消息的格式(如果有) 必要的。格式应该包括本地化 参数:记录-日志事件的描述。空记录是无效的 默认忽略,不发布 [链

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

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

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

公共摘要无效发布(LogRecord记录)发布日志记录。 日志记录请求最初是向记录器对象发出的,该记录器对象 初始化日志记录并将其转发到此处

处理程序负责设置消息的格式(如果有) 必要的。格式应该包括本地化

参数:记录-日志事件的描述。空记录是无效的 默认忽略,不发布


[链接:

在这种情况下,API规范并不总是与实现匹配。源代码中的不成文规则似乎是:

  • 对空记录的处理可能是恶意的,也可能被忽略。和的子类。记录器从不将空传递给发布,因此您选择什么并不重要
  • 从isLoggable引发的任何运行时异常都将转义处理程序。这意味着从筛选器引发的任何异常都将转义发布方法,并且不会被错误管理器捕获。请注意,没有枚举,这意味着该行为是故意的
  • ErrorManager文档中列举了发布不应引发的异常。大多数情况下是格式和写入错误
  • Really publish应委托错误管理器来确定是否存在错误。从文档中可以看出:

    如果在使用此处理程序时发生任何错误,将调用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;
        }
    }
    
    公共类HostileErrorManager扩展了ErrorManager{
    @凌驾
    公共无效错误(字符串消息、异常ex、整数代码){
    Sneelkythrow(新的可丢弃(msg+“:”+代码,ex));
    }
    @抑制警告(“未选中”)
    私人空间鬼鬼祟祟(可丢弃的t)抛出t{
    投掷(T)T;
    }
    }