如何捕获以下错误:No error: PDO constructor was not called
?
我的问题不是不是如何解决错误,而是如何捕获该错误!
对于PHPUnit测试环境,我需要它。
我正试图抓住它,但是那样行不通。
$pdo = (new \ReflectionClass(\PDO::class))->newInstanceWithoutConstructor();
try
{
$pdo->query("SELECT * FROM table");
}
catch (ErrorException $exc)
{
echo $exc->getTraceAsString();
}
确切的(错误)消息如下:PDO::query(): SQLSTATE[00000]: No error: PDO constructor was not called
,但我不确定,是否可以捕获任何类型的PHP。
我已经检查了the method pdo_raise_impl_error()
[PHP 7.3.3],其中提到了错误消息,但是我没有足够的智慧去预测错误的实际类型...
可以请人提供建议吗?
答案 0 :(得分:2)
不知道您是否正在寻找解决方案,但是您始终可以使用像
这样的简单代码来convert all errors to exceptionsset_error_handler(function ($level, $message, $file = '', $line = 0)
{
throw new ErrorException($message, 0, $level, $file, $line);
});
当然,它将创建一个全局错误处理程序,但是老实说,我相信每个PHP项目都应该具有这样的代码。
或者至少您只能暂时调用此处理程序
答案 1 :(得分:0)
我现在在测试前使用以下代码。 请特别检查代码的第一行和最后一行。
感谢@YourCommonSense!
set_error_handler(function(int $errno, string $errstr, string $errfile, int $errline) {
throw new ErrorException($errstr, $errno, E_ERROR, $errfile, $errline);
});
$this->expectException(ErrorException::class);
$this->expectExceptionMessage("SQLSTATE[00000]: No error: PDO constructor was not called");
/* @var $pdo PDO */
$pdo = (new ReflectionClass(PDO::class))->newInstanceWithoutConstructor();
$pdo->query("SELECT * FROM table"); // triggers the error.
restore_error_handler();