2011-05-18 84 views
8

我正在开发一个API包装类,这是我做的第一个。 大部分它并没有太困难。 到达需要处理由API返回的错误的可能性,但是我应该如何处理这些错误。什么时候应该抛出异常而不是在PHP中返回错误?

外部文件将调用API类,即findVenueByLocationID($locationID); 该函数将构造API调用的URL和方法(POST,GET,DELETE等)并将其传递给一个名为makeCall的函数。

MakeCall构造完成的URL,将请求发送到服务并返回生成的XML。如果API返回一个错误,它就在它返回的XML中。该URL使用函数file_get_contents()来调用。该API具有一定数量的错误代码,它将在XML中返回。

据我了解,我应该做的功能MakeCall函数中执行以下操作:

  • 返回XML之前,先检查,看看它是否包含一个错误代码,如果是的话,传递一个错误处理类来处理错误。 (日志和返回客户端版本错误信息)
  • 添加一个围绕file_get_contents()函数的try catch来捕获任何连接错误,即无法访问服务器?

这被认为是最好的办法吗? 我应该在makeCall的调用中添加try catch,而不是在file_get_contents中添加try_all? 我应该为XML返回的每个错误抛出一个异常,并用错误类来处理它们吗?

我在寻找的答案应该还包含一个资源链接,解释一些关于API封装器或类似事情的错误处理的最佳实践。

在此先感谢您的时间和回复。


编辑: 与我们的CTO交谈后,在当前版本的PHP错误也有例外,我应该抛出异常,并留下异常给调用者的交易。请记住,我正在为API实现包装类。思考?

+0

'file_get_contents()'触发警告,如果它不能检索或读取资源,所以try ... catch不会帮助你。如果您使用诸如'Zend_Http_Client'的类,您将能够更容易地拦截失败。 – 2011-05-18 15:09:03

回答

3

您应该首先了解异常和错误之间的区别:发生错误,异常例外。

例如,输入错误密码(无法登录)的用户出错。当数据库在检查密码时不可用时,您会得到一个异常(并希望能正常处理该异常)。

所以,如果你从第三方获得XML,你可能会认为它是有效的。但可能会有错误。如果API给你一个错误(找不到位置),它也可能是你的错误。只有在特殊情况下(你已经硬编码了一个你肯定知道的位置肯定会存在),这可能是一个例外。

最琐碎的例外是连接错误:那么肯定有什么错误。另一个简单的事情就是你可以期待的API错误,比如“没有新的信息”(就像一个例子):这是一个内部错误。在某个地方你必须画出一条线,但在大多数情况下,它很清楚什么是例外,什么是可能发生的错误。

+0

感谢您对此的看法。看起来像我们的uni错过了这个重要的信息...可以更好地解释为一个错误是当数据处理有问题,并且例外是当过程不能完成? – Relequestual 2011-05-18 16:56:48

+0

这是一个很常用的变体,我猜可能可以在这种情况下使用,但请记住,没有“真正的”和绝对的解决方案,只有每种情况的指导方针。例如,如果你有一个情况(已知错误的连接,也许你甚至在测试连接),一个进程不会完成,你可能会说这是一个错误。所以在这种情况下,你的连接会抛出一个异常(因为对于连接来说很奇怪:它不能做它应该做的事情),但是你会在你的测试程序中捕获它并返回一个错误。 – Nanne 2011-05-18 21:28:28

相关问题