Почему это исключение PDOException не перехвачено?

#php

#php

Вопрос:

У меня есть этот небольшой фрагмент, который подключается к sql server с помощью PDO, и он завершается с ошибкой, потому что мой сервер не работает (что правильно, это сценарий, который я хочу протестировать). Однако исключение не перехвачено!

 $dsn = "sqlsrv:Server=$host,$port;Database=$database";
$conn = new PDO($dsn, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$works = false;
try {
    $works = ($conn->exec('SELECT * FROM INFORMATION_SCHEMA.TABLES') !== false);
}
catch (PDOException $e) {
}
echo "works? " . ($works ? 'yes' : 'no') . "n";
  

Вывод, который я получаю в консоли:

 ➜  backend git:(dev) ✗ php mssql-pdo-test.php
PHP Fatal error:  Uncaught PDOException: SQLSTATE[HYT00]: [Microsoft][ODBC Driver 17 for SQL Server]Login
timeout expired in /path/mssql-pdo-test.php:10
Stack trace:
#0 /path/mssql-pdo-test.php(10): PDO->__construct()
#1 {main}
  thrown in /path/mssql-pdo-test.php on line 10
  

Комментарии:

1. Не является ли этот сбой результатом создания экземпляра соединения PDO, которое НЕ находится внутри вашего блока try / catch?

2. Исключение генерируется new PDO не exec() .

3. Я чувствую себя довольно глупо, но я знал, что это должно быть просто… Я не понимал, что «новый PDO» уже активно что-то делал, но, конечно, это имеет смысл. Спасибо!

Ответ №1:

Я предполагаю, что исключение выбрасывается за пределы блока try / catch здесь:

 $conn = new PDO($dsn, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  

Комментарии:

1. Я чувствую себя довольно глупо, но я знал, что это должно быть просто… Я не понимал, что «новый PDO» уже активно что-то делал, но, конечно, это имеет смысл. Спасибо!