【问题标题】:Convert API errors codes to exceptions将 API 错误代码转换为异常
【发布时间】:2013-03-14 22:29:33
【问题描述】:

我正在开发一些 API 的 PHP 接口,它可以返回许多(最多一百个)不同的错误代码。当遇到这样的代码时,我的界面应该抛出异常。我的 PHP 有点生疏了,因此我不确定对于当今的 php 程序员来说什么是最合适的选择:

  • 每个错误代码都有一个单独的MyApiThisAndThatError 类?
  • 或者有一个泛型类MyApiError 并提供API 错误代码作为参数?

我也愿意接受其他建议。

【问题讨论】:

  • 如果错误代码可以按逻辑分组(例如登录错误、API 查询中的语法错误……),那么这可能证明相应命名的异常类是合理的。

标签: php api exception


【解决方案1】:

TLDR: 使用包含 API 错误代码的通用 MyApiException 类。

Ralph Schindler 在http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3 写了一篇关于一般主题的精彩文章

如果您通读全文,您会看到 Best Practices In Library Code 部分演示(我已针对此上下文修改了他的示例):

// usage of bracket syntax for brevity
namespace MyCompany\Component {

    interface Exception
    {}

    class MyApiException 
        extends \RuntimeException 
        implements Exception
    {}

    class Component
    {
        public static function doSomething()
        {
            $myApiCall->doSomthing();
            if ($myApiCall->hasError) {
                throw new MyApiException($myApiCall->getMessage(), $myApiCall->getErrorCode);
            }
        }
    }
}

假设上面的代码,如果要执行 MyCompany\Component\Component::doSomething(),从 doSomething() 方法发出的异常可以被以下任何一种类型捕获:PHP 的 Exception,SPL 的 RuntimeException组件的 MyCompany\Component\MyApiException,或组件的 MyCompany\Component\Exception。这为调用者提供了许多机会来捕获从库中给定组件发出的异常,该异常由返回的 API 错误引发。此外,通过分析构成异常的类型,可以为刚刚发生的异常情况赋予更多的语义意义。

【讨论】:

  • 谢谢,这就是我要找的。​​span>
【解决方案2】:

我遇到了类似的问题。当我这样做的时候,我把所有的错误分成了家族(即查询、模型、控制器、表单等),然后在每个错误家族中,我为每个错误代码定义了常量。

理想情况下,我希望有一个统一的异常类,但在某些地方我会在 try catch 块中调用一组函数,最好将它们分成不同的家族,这样我就可以做到每个错误系列的捕获,这将适当地确定下一步要做什么。是的,我本可以有一个统一的错误捕获器和一个根据错误号确定族的函数,但它似乎不太优雅。

【讨论】:

  • 谢谢!是的,“优雅”是关键词。
【解决方案3】:

这取决于几个因素。在我看来,这些是特定例外的原因:

  1. 您可以对错误进行逻辑分组,并对异常进行逻辑命名。
  2. 错误具有取决于错误类型的附加数据(您可以存储这些附加数据,用户可以使用 set/get 很好地访问它们)。
  3. 很少添加新的错误类型(但您总是可以为未知错误代码抛出一些基本的通用异常)。
  4. 错误的含义会随时间变化(界面的用户将基于异常类型,而不是基础错误代码)。
  5. 您已准备好正确记录您的特定异常,这样用户就不必根据底层错误代码查找 API 文档。

【讨论】:

  • 谢谢,这听起来很合理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2011-03-26
  • 2017-05-31
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多