【问题标题】:Always declare "throws Exception" on interface method? [duplicate]总是在接口方法上声明“抛出异常”? [复制]
【发布时间】:2017-07-26 19:02:57
【问题描述】:

如果您有一个接口,但您不知道它的方法将如何实现(即它是一个其他用户将扩展的库),您如何知道该方法的实现是否容易出现异常?您是否应该因为不知道实现而只在每个接口方法上声明“抛出异常”?

例如,我正在制作一个 http 客户端。这个库有一个Request 接口,代表一个http请求字符串:

public interface Request
{
    String asString(); // no "throws" here  
}

public final class AssembledRequest implements Request
{
    // ...
    public AssembledRequest(Method method, Url url, Headers headers, Body body) {
        // ...
    }
    public String asString() {
        // ...
    }
}

它还有一个Response 类,它使用这个Request 接口。 我自己的实现 (AssembledRequest) 不会抛出异常,它只是组装一堆字符串,可能大多数实现也不会抛出任何东西。

但是如果用户想要以asString 从文件中读取的方式实现Request 怎么办?然后我们正在处理IOExcepton,用户将很难处理此类异常。没有声明throws...,所以你必须在方法内部处理它,这是一个不,不,因为你想抓住它并重新抛出,所以它会冒泡到你的应用程序的顶部然后被处理。

如果Request 接口在asString 上声明了throws Exception,那就容易多了。这让我得出结论,对于库,所有接口的方法都应该有throws Exception。我说的对吗?

【问题讨论】:

  • 您应该知道这些方法是否有可能引发异常。如果您不想让它抛出异常,那么如果它们容易发生异常,则必须在实现它的方法中 try-catch
  • throws Exception 添加到接口方法中,因为有一天,也许,只是也许,有人可能需要它是最糟糕的一种 YAGNI(你不会需要它)。你让所有的后代永远付出代价。不是一个好计划。
  • @BobDalgleish 当asString 读取文件时,你会如何解决我的问题?
  • 实现总是会抛出 unchecked 异常,RuntimeException,如果他们面临无法处理的事情。但是通用合约(接口JavaDoc)应该指定期望什么样的错误处理。

标签: java oop exception-handling


【解决方案1】:

接口是实现和规范之间的API。如果您正在编写 API,那么您将知道您的 API 是否/何时允许抛出某些东西。

也就是说,我会采取以下两种行动之一:

  • 实现一个单独的接口,可以接受抛出这些异常,或者
  • 将检查的异常包装在某种RuntimeException 中,然后让它冒泡。

异常是有原因的。除非您的代码明确要求它,否则不要明确允许它。

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2013-03-28
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多