1

缺少参数的函数会引发ArgumentCountError错误

ArgumentCountError:函数的参数太少......

而未知的命名参数只会引发一般错误

错误:未知的命名参数...

我只想抓住这两个错误,到目前为止我有以下

function foo(int $bar, int $baz) {}

try {
    foo(...$arr); // $arr is always an associative array

} catch (ArgumentCountError $error) {
    // ...

} catch (Error $error) {
    if (preg_match("/^Unknown named parameter/", $e->getMessage())) {
        // ...

    } else {
        throw $error;
    }
}

我有什么替代方法?不应该Unknown named parameter得到它自己的错误。

编辑:

对于一个UnknownNamedParameterError用法

try {
    $dynamicFoo(...$args);

} catch (UnknownNamedParameterError $error) {
    // if needed, a check to confirm the error happened in foo
    if (($error->getTrace()[0]["function"] ?? null) === $dynamicFoo) {
        // Hacky but whatever

    }
}
4

2 回答 2

2

未知命名参数不应该得到它自己的错误。

也许吧,但有人需要先阐明为什么这是一个好主意的原因。

使用异常来控制流是听起来不那么糟糕的事情之一,但对于试图维护软件的人来说却是非常令人讨厌的惊喜。

考虑以下代码,其中当命名参数调用函数时会出现 ArgumentCountError:

function foo($param1, $param2) 
{
   $values = [
       'param1' => $param1,
       'param2' => $param2,
       'param3' => 'john'
   ];

   bar(...$values);
}

function bar($param1, $param2, $param3) {...}


try {
    foo(...$userInput);
}
catch (ArgumentCountError $ace) {
   // tell the user they have sent the wrong parameters.
}

到目前为止,一切都很好。现在想象一下功能栏的签名更改为:

function bar($param1, $param2, $surprise) {...}

但是我们忘记在函数 foo 中调用 bar() 的地方进行适当的更改。所有用户的代码都会失败,他们会收到误导性的错误消息,这是非常令人惊讶的行为。

或者简单地说,捕获由不正确的命名参数引起的异常并不是一件安全的事情,因此 PHP 核心不会假装它是。

我有什么替代方法?

您应该在尝试使用数据之前对其进行验证,而不是尝试捕获异常来处理不良数据。

于 2020-10-30T22:34:14.623 回答
0

我同意对此应该有一个自定义例外。无论如何,关于您的解决方案,我现在想不出任何替代方案。但是,当 PHP 抛出ArgumentCountError.

于 2020-10-26T08:55:43.807 回答