在PHP中返回错误对象的坏习惯?

时间:2012-01-28 10:25:15

标签: php error-handling

我是php的新手,因为似乎没有从方法到其调用者的错误对象通信,我感到有点困惑。

这两个是我学习使用的方式:

  1. 如果一个方法不应该通知错误的调用者它只是触发一个错误,如果这不是E_USER_ERROR它只能返回FALSE告诉调用者出错了。

  2. 另一方面,如果某个方法需要向调用者发回一些错误信息,则应引发异常。

  3. 来自COCOA我已经学会在非常条件下使用例外(程序员错误导致的不可恢复的错误)。在任何其他情况下,只需将错误对象传递给调用者。

    • 哲学在PHP中是不同的吗?
    • 异常是将错误数据发送回调用者的标准机制吗?
    • 我是否应该避免编写自己的错误对象并将其作为out参数传递给方法以与PHP模式保持一致?

2 个答案:

答案 0 :(得分:10)

PHP有两种主要的机制来指示和处理程序流中的错误:

选择哪个取决于您的个人偏好。例外是对象,因此如果您想要执行OOP或来自也使用例外的其他语言,您可能希望使用它们。基于非异常的错误处理适用于PHP可以发出的所有通知,警告和错误,以及您自己的那些变体。如果您想将这些转换为例外,请查看ErrorException

但是,正如您已经提到的:例外是针对不可恢复的情况。他们用于管理常规控制流程。因此,例外不是将错误消息发送回呼叫者的某种标准机制,例如,你不应该这样做:

class FooValidator
{
    public function isValid($valueToValidate)
    {
        if ($this->satisfiesRules($valueToValidate) {
            return true;
        }
        throw new ValidationException('Foo didnt satisfy rule Bar');
    }
}

他们在调用者中尝试/捕获它。验证失败是可恢复的情况。

一种选择是引入Notification Object

class FooValidator
{
    public function isValid($valueToValidate, Notification $notification)
    {
        if ($this->satisfiesRules($valueToValidate) {
            return true;
        }
        $notification->addMessage('Foo didnt satisfy rule Bar');
        return false;
    }
}

在上面的示例中,Validator仅返回一个布尔值,但可以收集有关传递的Notification对象中验证失败原因的其他信息。这比从调用返回错误对象要清晰得多,因为我们不必检查返回类型。如果验证返回false,我们知道我们可以检查Notification对象。由于对象是通过引用传递的,因此我们不需要从调用中返回对象,而只需访问来自调用者的收集消息。

答案 1 :(得分:0)

在PHP中几乎所有东西都是可能的,所以没有最好的方法。

看看php.net上的例外情况 http://php.net/manual/en/language.exceptions.php