php - php中错误处理的正确方法

标签 php error-handling

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

我还意识到,最推荐的方法是使用 PHP 异常模型,并且我有兴趣了解下面的示例如何转化为这一点。

编辑:我正在寻找的是如何最好地处理验证表单数据时生成的错误(而不是如何调用方法的错误)的想法,也许是异常模型不适用于此用例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 人,

最佳答案

这确实取决于。不过,“正确的”面向对象方法是使用异常。已经内置了许多不同类型的异常(请参阅 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);
}

无论如何,只有当该方法实际上被错误调用,或者该方法以致命方式失败时,才应抛出异常。

关于php - php中错误处理的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12835984/

相关文章:

php - 如何将 shell 变量作为参数传递到 PHP 函数调用中?

php - 如何使用 PHP 以编程方式柔化图像的边缘?

python - 当信号处理程序中遇到异常时,如何使 Django 信号处理程序不会静默失败?

php - CodeIgniter 中缩短的电子邮件主题

php - 使用 PHP 将文本区域的内容保存到 .txt 文件

javascript - 调试Windows应用商店应用-错误消息始终显示相同的行号

Java GUI - 华氏度到摄氏度

mysql_error() 在通过unix终端运行的php中返回 'No such file or directory'

error-handling - 如何在 React Native 应用程序中报告不同的错误?

php - Laravel 5.2 左连接一对多的行与最高值的列