【问题标题】:Documenting unchecked exceptions记录未经检查的异常
【发布时间】:2015-11-06 06:39:21
【问题描述】:

我正在阅读 J. Bloch 的有效 Java,现在我正在阅读有关记录未经检查的异常的部分。他说

使用 Javadoc @throws 标记记录每个未经检查的异常 一个方法可以抛出 [...]。

public interface Parameters {
    //other method ommited

    /**
     * __DESCRIPTION_OMMITED__
     *
     * @throws ParameterAlreadyExistsException  If a parameter with the same name already exists in this container.
     */
    public <M> void put(ParameterMetaData<M> p, M value);
}

其中public interface ParameterMetaData&lt;ValueType&gt;{ } 只是一个确保编译时类型安全的标记。 ParameterAlreadyExistsException 是 RuntimeException 的直接子类。

这是它的基本实现:

public final class ParametersImpl implements Parameters{

    private final Map<ParameterMetaData<?>, Object> parameters;

    @Override
    public <M> void put(ParameterMetaData<M> p, M value){
        if(value == null)
            return;
        if(parameters.containsKey(p))
            throw new ParamAlreadyExistsException(String.format("The parameter with the name %s already exists. Value: %s", p.getClass(), parameters.get(p)));
        try{
            parameters.put(p, value);
        } catch (Exception e){
            throw new RuntimeException(String.format("Parameter insertion failed. ParameterMetaData: %s Value: %s", p.getName(), value), e);
                         // ^----------------Here non-documented exception is thrown.
        }
    }

    //remainders ommited
}

由于Map#put(K, V) 方法抛出并且我的实现使用它并抛出RuntimeException 如果出现错误,我应该如何记录这个事实?我应该这样做吗?目前,根据接口文档判断为什么抛出 RuntimeException 可能很难说什么。

问题:我应该如何处理特定于实现的异常?我应该记录它们吗?

【问题讨论】:

  • Map.put() 不会抛出任何检查异常。它抛出的所有运行时异常都是代码中存在错误的信号。你不会抓住任何一个。
  • @JBNizet 实际上并没有。但是,如果我没有抓住它,它会传播,并且接口的客户端会看到一些关于放入内部 HashMap 的令人困惑的消息。也许抓住它并转化为更合适的异常会很好?
  • 这不应该发生,因为它是一个错误,你应该测试和交付没有错误。当然会发生,因为没有人是完美的。但是有一个异常指向错误是一件好事:您将能够快速识别它的来源并修复它。保持代码干净。您不能合理地将每个方法调用包装到一个 try-catch 块中,以防该方法调用引发意外的运行时异常。

标签: java exception exception-handling


【解决方案1】:

我应该如何处理特定于实现的异常?我应该记录它们吗?

你没有。就像 JB Nizet 在评论中指出的那样,这是一个错误,您应该测试/修复这些类型的问题。

如果您担心会向用户显示内部错误,可以显示一般错误,例如“发生未知错误”。在您的日志记录中,您可以记录实际的异常,以便您的用户可以向您报告错误,并且您可以查看出了什么问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2015-05-24
    • 2010-10-03
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多