php中错误处理的正确方法

时间:2012-10-11 09:05:07

标签: php error-handling

我意识到这是一个很大的主题,但我会对处理错误的最佳实践方法有一些粗略的想法,特别是在OO PHP中(但也对超越语言细节的好模式感兴趣)。我们假设这些类和应用程序都是大规模的。

我也意识到最推荐的方法是使用PHPs Exception模型,我很想知道下面的例子如何转化为这个。

编辑:我正在寻找的是关于如何最好地处理验证说明表单数据时产生的错误(不是调用方法的错误)的想法,也许是Exception模型不适用于此用例 END EDIT

特别是考虑到并非所有错误都需要立即显示/使用(可以在同一个方法中使用多个异常?),有些可能需要记录(这是我猜的另一个问题),有些可能只是相关的其他依赖项为true(或false),有些可能只是警告,有些可能是关键,有些可能是状态/通知。

我采取的当前方法是:

class ClassName()
{
    public MethodName( $data, &$errors )
    {
        $e = [];

        // validate content and perform data handling
        // any errors should be added to the array $e

        if( empty( $e ) ) {
            return $processed_data;
        } else {
            $errors = $e;
            return false;
        }
    }
}

// and then calling:
$method_call = ClassName::MethodName( $data, $errors );

if( $method_call ) // do something with the data/display success message etc.
else // decide what to do with any errors

Tar Folks,

1 个答案:

答案 0 :(得分:2)

这完全取决于。 “适当的”OO方式是使用异常。内置了许多不同类型的异常(请参阅http://www.php.net/manual/en/spl.exceptions.php),您可以定义自己的异常(请参阅http://php.net/manual/en/language.exceptions.php)。

使用它们的方法可能与此类似

function foo($bar)
{
    if(!is_string($bar))
        throw new InvalidArgumentException("String argument expected");

    if(strlen($bar) > 50)
        throw new LengthException("String argument is too long!");
}

然后,在调用代码时,使用try / catch,例如

try {
     foo("hjsdkfjhkvbnsjd");
} catch(LengthException $ex) {
     // Trim the string
} catch (InvalidArgumentException $ex) {
     // Try to recover. Cast or trim or something
} catch (Exception $ex) {
     // We hit an exception we're not explicitly handling.  
     // Gracefully exit
     die($ex->Message);
}

在任何情况下,只有在实际调用方法错误或方法以致命方式失败时才应抛出异常。