使用try..catch捕获错误(通知)

时间:2018-04-27 19:16:16

标签: php

我有一个PHP脚本,它接收带有多个数据(+30)的POST,所有这些都是必需的。而不是像 isset() strlen()一样逐一检查,如建议here,如果我能抓住通知错误&#34将会很棒;未定义的索引"不知何故。在Google上进行研究我发现很少有关于此主题的旧帖子,例如this one,所以也许有一些新的技术或解决方法来存档这个目标。

更新

根据@bishop的回答,这是我的解决方案:

try {

    if ($_SERVER['REQUEST_METHOD'] == 'POST') {

        $flds = ['data1', 'data2', 'data3'];
        if (count(array_diff($flds, array_keys($_POST))) > 0) {
            throw new Exception('Missing fields detected!');
        }

        /* @bishop solution    
        $vals = array_filter($_POST, function($val) { return ($val != ''); });
        if (count(array_diff($_POST, $vals)) > 0) {
             throw new Exception('Empty fields detected!');
        }
        */

        // I prefered using the bellow approach instead of @bishop
        // solution, once I will need to sanitize values anyway

        foreach($_POST as $input => $value) {
            $_POST[$input] = trim($value);
            if (strlen($_POST[$input]) === 0) {
                throw new Exception('Empty fields detected!');
            }
            //$_POST[$input] = mysqli_real_escape_string($conn, $value);
        }
    }

} catch (Exception $e) {
    echo $e->getMessage();
}

1 个答案:

答案 0 :(得分:2)

如果您想检查每个字段是否存在,可以使用array_diffarray_filter

// check for missing keys in the post data
$expect = [ 'data1', 'data2', 'data3' ];
if ($missing = array_diff($expect, array_keys($_POST))) {
    var_dump($missing);
}

// check for missing values in the post data: modify to suit
$passed = array_filter($_POST, function($value) { return ! empty($value); });
if ($invalid = array_diff($_POST, $passed)) {
    var_dump($invalid);
}

但是,按照你描述的方式去做:

// temporarily catch all raised errors, warnings, and notices
$errors = [];
set_error_handler(function ($code, $message, $file, $line, $context) use (&$errors) {
    $errors[] = [ $code, $message ];
});

// do your "validation"
if ($foo) {
    echo "foo";
}

// restore the state of the world, and check for errors
restore_error_handler();
if (count($errors)) {
    echo 'Bad bad!';
}

但使用风险自负。通常,最好是积极检查可接受的值,并使用任何生成的错误/警告/通知作为您的逻辑未按预期工作的上下文。

捕获错误以进行检查是许多框架的一部分。一些外部库也提供它,如Haldayne/fox。免责声明:我是Haldayne的作者。