php - 为什么 PDO 抛出 ErrorException 而不是 PDOException?

标签 php mysql exception pdo

我让 Sentry 跟踪我的 PHP 应用程序中的未捕获异常,并且我注意到 PDO 中有一个特殊的未捕获异常。代码如下所示:

   /**
    * @return boolean TRUE if the connection to the database worked; FALSE otherwise. 
    */
   public function verifyDatabase() {
       try{ 
           $this->pdo->query('SELECT 1');
           return true;
       }
       catch (\PDOException $e) {
           echo 'Lost connection to database: ' . $e->getMessage() . PHP_EOL;
           return false;
       }
    }

这应该会捕获诸如“MySQL 服务器已消失”之类的错误,并且它确实可以在我的开发机器上运行。然而,最近哨兵记录了这个错误:

错误异常 PDO::query(): MySQL 服务器已经消失

根据 sentry 的说法,这是由上面的 $this->pdo->query('SELECT 1'); 语句抛出的。像这样的错误应该被 try/catch 捕捉到。为什么 PDO 抛出 ErrorException 而不是 PDOException

最佳答案

我无法重现 ErrorException。

$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', ..., ...);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

sleep(20); // during this sleep, I stop my MySQL Server instance.

$result = $pdo->query("SELECT 1");

输出:

Warning: PDO::query(): MySQL server has gone away

Warning: PDO::query(): Error reading result set's header

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
Stack trace:
#0 /Users/bkarwin/Documents/SO/pdo.php(8): PDO->query('SELECT 1')

这表明它在服务器离开时抛出 PDOException,而不是 ErrorException。

使用 MySQL 5.6.37 和 PHP 7.1.23 进行测试。

我想知道您在问题中显示的代码是否实际上是已部署并向 Sentry 抛出异常的代码。也许你有这样的代码:

   catch (\PDOException $e) {
       throw ErrorException($e->getMessage());
   }

要么在您的 verifyDatabase() 函数中,要么在调用 verifyDatabase() 的代码中。换句话说,当 verifyDatabase() 返回 false 时,您的应用会做什么?

关于php - 为什么 PDO 抛出 ErrorException 而不是 PDOException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128525/

相关文章:

php - Mongodb - 数组查询,仅查找所有元素匹配的位置

php - 在php中从mysql获取特定列数据的最简单方法(特殊情况)

.net - 如何从线程中捕获异常?

javascript - Laravel获取图像的文件内容但在生产环境上不起作用

php - 使用 PHP - MySQL 进行 MMORPG

mysql - 将具有相同状态的行分组,直到状态更改

c++ - regex_match 抛出运行时异常

php:捕获PDO异常并继续执行?

php - 数据库中的口音

php - 注册时生成的哈希与登录时生成的哈希不同