将API错误代码转换为异常

时间:2013-03-25 12:23:02

标签: php api exception

我正在研究某个API的PHP接口,它可以返回许多(最多100个)不同的错误代码。当遇到这样的代码时,我的接口应该抛出异常。我的PHP有点生疏,因此我不确定什么是现在的php程序员最合适的选择:

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

我也愿意接受其他建议。

3 个答案:

答案 0 :(得分:7)

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

Ralph Schindler在http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3

上写了一篇关于一般主题的好文章

如果您阅读了整篇文章,您会看到一个图书馆代码中的最佳实践部分,该部分演示了(我已针对此背景修改了他的示例):

// 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的异常,SPL的RuntimeException组件的MyCompany \ Component \ MyApiException,或组件的MyCompany \ Component \ Exception。这为调用者提供了许多机会来捕获从库中给定组件发出的异常,这是由返回的API错误引发的。此外,通过分析构成异常的类型,可以为刚刚发生的异常情况赋予更多的语义含义。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

  1. 您可以对错误进行逻辑分组,并在逻辑上命名例外。
  2. 错误具有依赖于错误类型的其他数据(您可以存储此附加数据,用户可以使用set / get很好地访问它们。)
  3. 很少添加新的错误类型(但是对于未知的错误代码,您总是可以抛出一些基本的通用异常)。
  4. 错误的含义及时更改(接口的用户将基于异常类型,而不是基础错误代码)。
  5. 您已准备好正确记录您的特定异常,因此用户无需根据基础错误代码查找API文档。