【问题标题】:How to handle exceptions when writing a library (not an application) - Java编写库(不是应用程序)时如何处理异常 - Java
【发布时间】:2011-04-05 19:03:13
【问题描述】:

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

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

如果我有一个包含可能引发异常的代码的方法(连接),我如何让这些异常浮动到最终程序员?这甚至是我应该处理的方式吗,取决于他们捕捉异常?等等……

【问题讨论】:

    标签: java exception exception-handling


    【解决方案1】:

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

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

    【讨论】:

    • s/感觉想放弃异常的原因/想被你的库用户私刑处死,他们很难调试错误/g
    【解决方案2】:

    我认为您应该决定现有类型是特定于实现还是库固有的。例如,如果它是一个与网络相关的异常,而您显然是在制作基于网络的 API,我会让它传播。调用者无论如何都需要注意这种错误。

    另一方面,如果它是与 数据库 相关的异常,这可能是因为出于某种奇怪的原因,您正在嵌入式数据库中查找 WSDL,或者类似的东西,这很明显不适合调用者必须处理 - 所以捕获它并将其包装在更适合您的抽象级别的异常中。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        问题是你希望你的图书馆有多不透明。

        您向用户抛出的每种异常类型都应暗示用户可以对其采取措施。例如,

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

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

        声明自己的异常类型(并且不要将其设为 RuntimeException)、捕获您观察到的异常并抛出异常可能对您来说是一个好方法。

        【讨论】:

          【解决方案5】:

          我认为 API 的作用以及在何种上下文中使用它很重要。

          如果 API 是您的表示/渲染层的一部分,那么我希望始终返回准备好渲染、装饰或写入响应流的内容。

          如果 API 旨在执行(非渲染/UI 相关)处理,那么抛出任何超出 API 逻辑范围的异常都没有问题。

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

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

          然而,在我的 API 实现中,我经常使用自定义异常类型,前提是它们的目的明确且有用。

          只是我的 2 美分 :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-07
            • 1970-01-01
            • 1970-01-01
            • 2012-05-01
            • 2014-05-04
            相关资源
            最近更新 更多