mysqli — пробуй / лови в переполнении стека

Я следую за курсом ООП mysqli. При подключении к базе данных они используют следующий скрипт:

$db = new mysqli("host", "user", "password", "database");
if ($db->connect_error){
$error = $db->connect_error;
echo("Not connected: " . $error);
}

Позже, однако, они вызывают файл подключения к базе данных с блоком try / catch:

try {
require_once "connection.php";
}catch (Exception $e){
$error = $e->getMessage();
echo $error;
}

Разве возможная ошибка подключения не обрабатывается файлом подключения сразу после попытки подключения? Блок try / catch делает в основном то же самое? Или блок try / catch ищет ошибку другого типа?

ОБНОВЛЕНИЕ: Просто чтобы уточнить, после прочтения некоторых ответов. Когда я просто делаю это:

try {
$db = new mysqli("host", "user", "password", "database");
}catch (Exception $e){
$error = $e->getMessage();
echo $error;
}

предполагая, что данные доступа к базе данных неверны (например, неправильный хост), я получаю предупреждение PHP, но не вывод ошибки в блоке catch. Разве улов не может обнаружить эту ошибку?

4

Решение

В первом разделе кода, когда вы используете оператор if, вы проверяете, верно ли это условие, и затем выводите свое сообщение.

Блок try catch по сути работает так

try{
//place code here that could potentially throw an exception
}
catch(Exception $e)
{
//We will catch ANY exception that the try block will throw

}

Таким образом, вы видите, что в то время как ваш оператор if проверяет состояние, которое вы ожидаете, блок try catch обнаружит все, что идет не так, даже те вещи, которые вы не ожидаете.
Следовательно, при отладке вы можете изменить код в блоке catch для обработки исключений по своему усмотрению.

Смотрите PHP документацию для получения дополнительной информации об исключениях
http://php.net/manual/en/language.exceptions.php

1

Другие решения

Если вам нужно перехватить исключения в расширении mysqli с помощью блока try / catch, попробуйте этот код (включите режим исключения вместо классического сообщения об ошибках):

// Method 1:
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR;

// OR Method 2:
mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ALL);

try {
$db = new mysqli("host", "user", "password", "database");
} catch (mysqli_sql_exception $e) {
...
}

mysqli_sql_exception
mysqli_driver

2

Вы спрашиваете о том, что с $db->connect_error а также try/catch?

$db->connect_error в основном из-за ошибок, которые мы уже знали (неверное имя пользователя и т. д.)

а также try/catch около системный уровень, если произошла ошибка,

PHP будет искать ближайший блок try / catch,

как только он что-то поймает, PHP все равно продолжит работу, как будто ничего не случилось раньше,

но если у вас нет try/catch блок и set_exception_handler() тоже,

PHP просто остановится по ошибке.

0
По вопросам рекламы [email protected]