【问题标题】:Catching unknown named parameter errors捕获未知的命名参数错误
【发布时间】:2021-02-08 08:05:59
【问题描述】:

缺少参数的函数会引发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

    }
}

【问题讨论】:

  • 检查 $arr 是否为空。

标签: php error-handling arguments parameter-passing php-8


【解决方案1】:

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

也许可以,但首先需要有人明确说明为什么这是个好主意。

对控制流使用异常是其中一种听起来不那么糟糕的事情,但结果却让试图维护软件的人大吃一惊。

当函数被命名参数调用时,考虑一下这段代码:

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 核心不会假装它是。

我有哪些替代方法?

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      相关资源
      最近更新 更多