【问题标题】:When should I throw an exception as opposed to return an error in PHP?什么时候应该抛出异常而不是在 PHP 中返回错误?
【发布时间】:2011-08-28 03:52:42
【问题描述】:

我正在开发一个 API 包装类,这是我制作的第一个。 在大多数情况下,这并不太难。 到达我需要处理 API 返回的潜在错误的地步,但对如何处理它们感到困惑。

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

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

据我了解,我应该在函数makeCall期间执行以下操作:

  • 在返回 XML 之前,检查它是否包含错误代码,如果包含,则将其传递给错误处理类以处理错误。 (记录并返回客户端版本错误信息)
  • 在 file_get_contents() 函数周围添加一个 try catch 以捕获任何连接错误,即无法访问服务器?

这被认为是做事的最佳方式吗? 我是否应该在 makeCall 调用周围添加一个 try catch,而不是在 file_get_contents 中添加一个 try catch? 我应该为 XML 返回的每个错误抛出异常并使用错误类处理它们吗?

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

提前感谢您的时间和回复。


编辑: 在与我们的 CTO 交谈后,当前版本的 PHP 中的错误是异常,我应该抛出异常并将异常的处理留给调用者。请记住,我正在为 API 实现一个包装类。想法?

【问题讨论】:

  • file_get_contents() 如果无法检索或读取资源,则会触发警告,因此 try...catch 不会帮助您。如果使用Zend_Http_Client 之类的类,则可以更轻松地拦截故障。

标签: api exception-handling error-handling php


【解决方案1】:

你应该先知道异常和错误的区别:错误发生,异常是异常的。

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

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

最微不足道的例外是连接错误:那么肯定有什么问题。另一个简单的事情是您可能期望的 API 中的错误,例如“没有新信息”(仅作为示例):这是一个内部错误。你必须在某个地方画一条线,但在大多数情况下,什么是异常的,什么是可能发生的错误是很清楚的。

【讨论】:

  • 感谢您对此的看法。看起来我们的大学错过了这一重要信息... 是否可以更好地解释为错误是数据处理出现问题而异常是流程无法完成?
  • 我猜这将是一个常用的变体,并且可能在这种情况下可用,但请记住,没有“真正的”和绝对的解决方案,只有每种情况的指南。例如,如果您有一种情况(已知连接不良,甚至可能正在测试连接),其中一个进程预计不会完成,您可能会称其为错误。因此,在这种情况下,您的连接会引发异常(因为连接很奇怪:它无法执行应有的操作),但您会捕获它并在测试程序中返回错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
相关资源
最近更新 更多