【发布时间】: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