#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» уже активно что-то делал, но, конечно, это имеет смысл. Спасибо!