php - 捕获未知的命名参数错误

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

缺少参数的函数会抛出 ArgumentCountError错误

ArgumentCountError: Too few arguments to function ...


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

Error: Unknown named parameter ...


我只想捕获这两个错误,到目前为止我有以下
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

    }
}

最佳答案

Shouldn't Unknown named parameter get it's own error.


也许吧,但有人需要先阐明为什么这是一个好主意的原因。
对控制流使用异常是其中一种听起来不那么糟糕的事情,但对于试图维护软件的人来说却是非常令人讨厌的惊喜。
考虑以下代码,其中当命名参数调用函数时会出现 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 核心不会假装它是。

What alternative approaches do I have?


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

关于php - 捕获未知的命名参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64530814/

相关文章:

尝试导出数据库时 phpMyAdmin 显示空白页?

error-handling - 如何使用/informational标志捕获IDL “message”

java - Python 通过异步递增变量运行 Java 命令行参数。

c# - 我如何处理asp.net中的异常?

c++ - 在 C++ 中期望各种参数类型

objective-c - 带有 NS_REQUIRES_NIL_TERMINATION 的多参数列表

php - Laravel AWS S3 上传照片错误(区域错误?)

php - 编辑 Laravel 中 Validator 的错误消息

php - 即时动态重新创建较小的 css 文件

c - 处理用户输入中的 EOF