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

标签 php exception pdo

您能解释一下 (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());
  }

最佳答案

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

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

catch block 使用与 the instanceof operator 相同的逻辑进行匹配- 您命名一个类或接口(interface),并且异常(exception)必须是同一类、子类或实现该接口(interface)。然后,您给出一个变量名称 - 在您的示例中 $e 中,但它可以是您喜欢的任何名称 - PHP 会将异常分配给该变量并运行 catch 的内容> 阻止。

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

所以,您显示的代码:

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

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

pointed out in another answer它确实删除了回溯,否则可能会暴露凭据。通过设置 zend.exception_ignore_args=true 可以更好地处理这个问题。在你的 PHP 配置中。 PHP 8.2 还将有 a new facility that automatically hides certain parameters in backtraces .

关于php - 请问 (PDOException $e) 和 PDOException($e->getMessage(), (int)$e->getCode()) 最简单的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71647872/

相关文章:

php - 重复月度和年度事件——如何保证准确性?

php - MySQL 休眠线程耗尽了我所有的连接

java - 为什么从列表中删除元素会抛出 ConcurrentModificationException?

php - PDO - 具有数组方面的 Foreach

php - 使用 PDO 插入记录失败

php - Cron 不会停止运行

php - 在 MySQL 中获取表列名?

php - 使用 LEFT JOIN 显示不匹配/不存在的行

c++ - 为什么 vector 访问运算符没有指定为 noexcept?

c++ - 如何在 bash 文件异常退出时捕获异常?