如何捕获“没有错误:未调用PDO构造函数”

时间:2019-09-24 12:11:21

标签: php pdo

如何捕获以下错误: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],其中提到了错误消息,但是我没有足够的智慧去预测错误的实际类型...

可以请人提供建议吗?

2 个答案:

答案 0 :(得分:2)

不知道您是否正在寻找解决方案,但是您始终可以使用像

这样的简单代码来convert all errors to exceptions
set_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();