您能解释一下 (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
关键字时,它们的特殊行为就会发生。
所以,您显示的代码:
- 运行一些可能引发异常的代码(
new PDO(...)
) - 捕获任何与
instanceof PDOException
匹配的异常 - 查找该异常对象上的“消息”和“代码”
- 创建一个新的
PDOException
对象 - 抛出新异常
结果本身几乎没有什么用 - 特别是,步骤 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/