如何在编写库(而不是应用程序)时处理异常 - Java

时间:2011-04-05 19:03:14

标签: java exception exception-handling

我目前正在为RESTful Web服务API编写Java Wrapper。

我现在正在尝试清理一些异常处理,并且不确定采取什么方法。这是一个供Java程序员使用的工具,因此我无法像使用最终用户应用程序那样处理它。

如果我有一个方法(连接)包含可能抛出异常的代码,我如何让这些异常浮动到最终程序员?这是否是我应该处理它的方式,取决于它们来捕捉异常?等...

5 个答案:

答案 0 :(得分:4)

我建议您从底层API中捕获异常(除非它们真正有意义通过),并抛出一个更适合您的抽象级别的新异常。

如果您不想丢弃异常原因,请使用exception chaining

答案 1 :(得分:2)

我认为您应该决定现有类型是特定于实现还是库固有的。例如,如果它是一个与网络相关的异常,并且您显然正在制作基于网络的API,那么我只是让它传播开来。无论如何,调用者需要知道这种错误。

另一方面,如果它是一个数据库相关的异常,这只是因为某些奇怪的原因你在嵌入式数据库中查找WSDL,或类似的东西,这显然是可能的不适合调用者必须处理 - 所以抓住它并将其包装在一个更适合你的抽象级别的异常中。

答案 2 :(得分:2)

在任何情况下都必须将异常传递给用户,因为它是一个库。

  • 如果您没有记录并且不打算创建自定义异常,那么您就不必处理异常。
  • 如果您正在记录,请处理异常并重新抛出异常。
  • 如果您有自定义异常,请确保它具有构造函数参数的异常,然后将当前异常链接到当前异常,然后抛出自定义异常。这是维护有用的堆栈跟踪信息所必需的。

答案 3 :(得分:0)

问题是你想要你的图书馆是多么不透明。

您向用户抛出的每种异常类型都应该暗示用户可以对此做些什么。例如,

catch (ConnectionException e) {
  disconnect();
  connectAgain();
}

仅在您的用户有权访问disconnect()和connectAgain()时才有效。但是,如果您承诺提供各种连接,那么您的代码应该已经具有此逻辑,如果失败,则抛出一个通用的WrapperException并完成它。

对你来说可能是一个很好的方法是声明你自己的异常类型(并且不要使它成为RuntimeException),捕获你观察到的异常并抛出你的异常。

答案 4 :(得分:0)

我认为它的重要性在于API的作用,以及在哪种情况下使用它。

如果API是演示文稿/渲染层的一部分,那么我宁愿总是返回一些可以渲染,修饰或写入响应流的内容。

如果API要执行(非呈现/ UI相关)处理,那么抛出API逻辑范围之外的任何异常都没有问题。

如果API设计得很好,这些原因显然超出了API的控制范围,或者逻辑上超出了API“知道如何”或“应该”处理的范围,即使它可以捕获/控制它。

当向“用户”返回异常时,我更愿意尽可能返回标准异常而不是单个自定义包装类型。

然而,在我的API实现中,如果它们具有明确且有用的用途,我会经常使用自定义异常类型。

只是我的2美分:)