我有一个关于java.util.logging.Handler的问题:
是否允许此抽象方法的实现抛出RuntimeExceptions,还是应该始终向错误管理器报告?
文档没有指定,但是类中的其他方法明确说明了它们可以抛出的内容:
public abstract void publish(LogRecord record)发布LogRecord。 日志记录请求最初是针对Logger对象进行的 初始化LogRecord并将其转发到此处。
处理程序负责格式化消息,何时以及是否 必要。格式应包括本地化。
参数:record - 日志事件的描述。空记录是 默默地忽略并且没有发表
答案 0 :(得分:0)
这种情况下API规范并不总是与实现相匹配。来自源代码的未经编写的规则似乎是:
真正发布应委托给错误管理器以确定是否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;
}
}