请问 (PDOException $e) 和 PDOException($e->getMessage(), (int)$e->getCode()) 最简单的意思是什么?

Please what does (PDOException $e) and PDOException($e->getMessage(), (int)$e->getCode()) mean in simplest terms?

您能解释一下 (PDOException $e) 和 PDOException($e->getMessage(), (int)$e->getCode()) 在这里的作用和含义吗?

try
  {
    $pdo = new PDO($attr, $user, $pass, $opts);
  }
  catch (PDOException $e)
  {
    throw new PDOException($e->getMessage(), (int)$e->getCode());
  }

让我们比较这段代码使用和不使用 try catch 的输出

$pdo = new PDO('foo', 'username', 'password');

会给我们

PHP Fatal error: Uncaught PDOException: PDO::__construct():
Argument #1 ($dsn) must be a valid data source name in pdo.php:6
Stack trace:
#0 C:\SERVER\www\htdocs\pdo.php(6): PDO->__construct('foo', 'username', 'password')
#1 {main} thrown in pdo.php on line 6

注意用户名和密码可以在错误信息中看到

现在使用 try catch 和 re-throw

try
{
    $pdo = new PDO('foo', 'username', 'password');
}
catch (PDOException $e)
{
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

输出将是

PHP Fatal error:  Uncaught PDOException: PDO::__construct(): 
Argument #1 ($dsn) must be a valid data source name in pdo.php:12
Stack trace:
#0 {main}
  thrown in pdo.php on line 12

如您所见,没有用户名或密码。

这是使用如此笨拙代码的唯一原因

最好的起点是 the PHP manual page on Exceptions

异常是一种强制错误处理机制 - 抛出异常会中止所有运行代码,而不是设置后续代码必须主动检查的标志一个匹配的 catch 块。如果没有找到 catch 块,则整个脚本退出。

catch 块使用与 the instanceof operator 相同的逻辑进行匹配 - 你命名一个 class 或接口,异常必须是相同的 class,一个 sub-class,或实现该接口。然后你给一个变量名 - 在你的例子 $e 中,但它可以是你喜欢的任何名字 - 并且 PHP 将异常分配给该变量并运行 catch 块的内容。

创建 异常与创建任何其他对象相同 - 您使用 new 运算符。创建后,它们可以具有属性和方法,包括包含 getMessage()getCode() 的默认集,这些 return 值是在最初构造时传递的。当您使用 throw 关键字时,它们会发生特殊行为。

因此,您显示的代码:

  1. 运行一些可能引发异常的代码 (new PDO(...))
  2. 捕获任何匹配 instanceof PDOException
  3. 的异常
  4. 在该异常对象上查找“消息”和“代码”
  5. 创建一个新的 PDOException 对象
  6. 抛出新异常

结果本身几乎没有用 - 特别是,步骤 4 和 5 可以替换为 throw $e,这基本上意味着“我已经查看了这个异常,但认为它仍然是一个问题; 继续寻找另一个匹配的 catch 块”。如果您想在第 3 步和第 4 步之间执行某些操作(例如日志记录或清理),这有时会很有用。

it does remove the backtrace, which might otherwise expose credentials. That would be better handled by setting zend.exception_ignore_args=true in your PHP configuration. PHP 8.2 will also have a new facility that automatically hides certain parameters in backtraces.