【问题标题】:Exception handling pattern for this type of situation?这种情况的异常处理模式?
【发布时间】:2009-06-12 18:24:25
【问题描述】:

我有来自 2 家不同公司的 2 个 API,它们允许我与他们的服务器通信以处理交易。我的任务是为这些 API 创建一个通用接口。我想出了这样的事情:

IServiceProvider <- ServiceProvider <- CompanyAServiceProvider
IServiceProvider <- ServiceProvider <- CompanyBServiceProvider

CompanyAServiceProvider 中,我正在使用他们提供的 API 与远程服务器进行交互。 A 公司的这个 API 抛出的异常与 B 公司的完全不同。

我可以在本地处理异常,但我认为这并不适合这种情况。

public String purchase(String amount) {
  try {
    request = new Request( RequestIF.NEW_ORDER_TRANSACTION );
  } catch ( InitializationException e ) {
    //do something.
  }
}

或者我可以向调用者抛出这个异常:

public String purchase(String amount) throws Exception {
  request = new Request( RequestIF.NEW_ORDER_TRANSACTION );
}

让调用者只处理Exception,不管那个异常是什么,也不管什么API抛出它。

当我处理 2 组不同的抛出异常时,如何为 2 个不同的 API 编写接口并保持其通用性。我是否正确处理了这个问题?最好的选择是什么?

【问题讨论】:

    标签: java exception


    【解决方案1】:

    在这种情况下,我创建了自己的 Exception 子类并仅包装实际的异常。然后我的 API 只公开我的异常。

    【讨论】:

    • 是的,创建你自己的异常子类。确保您支持将异常作为参数的异常构造函数。您的 API 可以创建命名为对该 API 的用户有意义的异常,并且您可以适当地包装来自您正在使用的第 3 方 API 的异常。这是最佳做法。
    • 如果在购买方法中,A公司的API会抛出多个不同的异常怎么办?我是否用我创建的不同异常类来包装每一个?
    • 如果你想传递原始异常的语义,你可以根据你原来的自定义异常创建多个异常类:MyException、Failure1Exception extends MyException等。然后你可以在方法上声明MyException或者列出 Failure1Exception、Failure2Exception 等。
    【解决方案2】:

    考虑一下您在调用函数级别处理的抽象级别。大概您不想公开您正在处理的各个公司的详细信息,并且更愿意处理更通用的概念,例如 Orders、PurchaceTransactions 等。 所以之前发帖人的建议是好的:创建一个像 PurchaseException 这样的类,它是你从供应商的各个异常类返回的信息的包装器。

    【讨论】:

      【解决方案3】:

      另一个在本地处理Exception 并自行滚动到下游(必要时)的原因:

      当抛出特定类型的Exception(因供应商而异)时,可能需要执行一些工作(清理、重试等)。

      【讨论】:

        猜你喜欢
        • 2013-03-21
        • 2012-12-16
        • 2021-06-11
        • 2021-09-12
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多