Ну, они очень похожи.В нативной обработке ошибок PHP вы можете выдавать свои собственные ошибки с помощью trigger_error($error, [$level])
, а вы можете выдавать свои собственные исключения с помощью throw new MyException($error)
;вы можете установить обработчик ошибок по умолчанию с помощью set_error_handler()
, который будет обрабатывать все ошибки PHP (кроме синтаксического анализа) по-своему, как вы можете установить обработчик исключений по умолчанию с помощью set_exception_handler()
.Собственные ошибки и исключения PHP автоматически каким-либо образом запускаются / генерируются: собственные ошибки PHP при компиляции сценария, исключения, если вы используете определенные элементы, такие как (PDO) или что-то в этом роде.
Теперь давайте попробуем один и тот же код с разными подходами: С собственными ошибками PHP вы можете делать такие вещи, как:
$db = new Database();
if ($db === NULL) { trigger_error("Cannot connect to the database", E_USER_ERROR); }
$result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
if (!$result) { trigger_error("Error updating table", E_USER_ERROR); }
$file = 'log.php';
if (!file_exists($file) or !file_get_contents($file)) { trigger_error("$file not found", E_USER_ERROR); }
require($file);
Я думаю, что это действительно не нуждается в каких-либо объяснениях.Если возникает ошибка, весь сценарий пропускается, и вы видите ошибку.Больше нет ничего, что вы можете сделать;Вы можете установить E_USER_ERROR
или E_USER_NOTICE
или E_USER_WARNING
и обрабатывать их по-разному, но у вас нет такого большого выбора.Теперь рассмотрим возможный подход ООП с блоками try{} catch() {}
:
try {
$db = new Database();
if (!$db) { throw new DBEx("Cannot connect to the database"); }
$result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
if (!$result) { throw new QueryEx("Query failed"); }
} catch (PDOException $e) {
echo $e->getMessage();
} catch (DBEx $e) {
$e->customFunction();
} catch (QueryEx) {
$e->customFunctionForQuery();
}
try {
$file = 'log.php';
if (!file_exists($file) or !file_get_contents($file)) { throw new FileEx("$file does not exists"); }
require($file);
} catch (FileEx) {
$e->fileGenerate();
$e->logError();
}
Основное отличие состоит в том, что если первый блок try{}
выдает исключение, второй try{}
будет выполнен любым способом.На самом деле, если выдается исключение, будет пропущена только остальная часть сценария внутри этого блока try{}
.
Другое отличие (то, которое я люблю больше всего) состоит в том, что вы можете создать несколько классов (расширение сети *).1022 * или PDOException
или другие) и настройте свое поведение по обработке ошибок.У вас есть неограниченные возможности для настройки ваших классов, добавления функций, редактирования уже существующих.Вы можете добавить определенную функцию (например, $e->fileGenerate();
) и вызывать их внутри блока catch() {}
, где это необходимо.
Также обратите внимание, что если вы хотите, чтобы весь сценарий останавливался в случае возникновения ошибки, это означает, что эта ошибканеобходимо trigger_error()
;вместо этого, если вы хотите, чтобы ошибка остановила только определенный блок кода, связанный с этой ошибкой, тогда пришло время попробовать и поймать.
Вы не должны использовать один вместо другого, вы должны использовать один рядом с другим, оценивая каждыйошибки как есть.
Кстати PDO::setAttribute()
измените значения и параметры по умолчанию в вашем обработчике базы данных.Например, вы можете изменить выборку по умолчанию (используется в PDOStatement::fetch()
) с помощью $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
.
Ссылки: