2014-12-07 2 views
2

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

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

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

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, но не выходной ошибка в блоке поймать. Не следует ли поймать эту ошибку?

+0

Пожалуйста, добавьте ссылка на курс –

+0

Если файл подключения генерировал исключение, и если блок catch завершил выполнение скрипта после отображения какого-либо исключения, я был бы склонен согласиться ... но на самом деле ничего на самом деле не обрабатывает какую-либо проблему соединения , потому что скрипт будет продолжать выполнять g независимо от того, имеет ли он соединение с базой данных или нет –

+0

joebezucha, курс называется доступом к базам данных с объектно-ориентированным PHP от lynda.com – cesarcarlos

ответ

1

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

Улов блок попытки по существу работает как этот

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

} 

Итак, вы видите, что в то время как ваша, если оператор проверка условия, что вы предвидя, блок попытки поймать обнаружишь что-нибудь, что идет не так, даже те, вещи, которые вы не ожидаете. Поэтому при отладке вы можете изменить код в блоке улова, чтобы иметь дело с исключениями, как вы считаете нужным

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

+0

Спасибо, Кайл. Я предположил, что единственной ошибкой, которая могла произойти, была ошибка соединения, проверенная $ db-> connect_error. Просто интересно, какой другой тип исключений может быть обнаружен try/catch при попытке подключения к базе данных. – cesarcarlos

+0

Когда вы используете блокировку catch с Exception $ e, это поймает любое исключение, которое будет выбрано, даже если это просто исключение соединения. Я нашел этот вопрос, который также может пригодиться вам. http://stackoverflow.com/questions/9836693/how-to-use-throw-exception-in-mysql-database-connect – KyleHodgetts

+0

Вот где я запутался. Если я ввожу неправильные параметры при попытке подключения к базе данных (см. Обновление, добавленное в мой пост), блок catch не выполняется (ошибка не отражается). Ошибка подключения не рассматривается как исключение? Спасибо – cesarcarlos

0

вы спрашиваете о том, что это разные с $db->connect_error и try/catch?

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

и try/catchо системном уровне, когда ошибка происходит,

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

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

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

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

0

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

// 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

Смежные вопросы