Обработка ошибок
CodeIgniter интегрирует обработку ошибок в вашу систему через исключения, как из коллекции SPL, так и несколько пользовательских исключений, предоставляемых фреймворком. В зависимости от настроек вашей среды, по умолчанию при возникновении ошибки или исключения отображается подробный отчет об ошибке, если приложение не запущено в production среде. В этом случае отображается более обобщенное сообщение для обеспечения наилучшего пользовательского опыта.
Использование исключений
Этот раздел представляет собой краткий обзор для начинающих программистов или разработчиков, не имеющих опыта работы с исключениями.
Исключения — это просто события, происходящие при «выбрасывании» исключения. Это прерывает текущий поток выполнения скрипта, и выполнение передаётся обработчику ошибок, который отображает соответствующую страницу ошибки:
throw new \Exception("Some message goes here");
Если вы вызываете метод, который может выбросить исключение, вы можете перехватить это исключение, используя try/catch блок:
try {
$user = $userModel->find($id);
} catch (\Exception $e) {
die($e->getMessage());
}
Если $userModel выбросит исключение, оно будет перехвачено, и выполнится код в блоке перехвата. В этом примере скрипт завершится, выведя сообщение об ошибке, определённое UserModel.
В примере выше мы перехватываем любой тип исключения. Если мы хотим отслеживать только определенные типы исключений, например, UnknownFileException, мы можем указать это в параметре перехвата. Любые другие исключения, которые будут выброшены и не являются дочерними классами перехваченного исключения, будут переданы обработчику ошибок:
catch (\CodeIgniter\UnknownFileException $e) {
// do something here...
}
Это может быть полезно для самостоятельной обработки ошибки или для выполнения очистки перед завершением скрипта. Если вы хотите, чтобы обработчик ошибок работал в обычном режиме, вы можете выбросить новое исключение в блоке перехвата:
catch (\CodeIgniter\UnknownFileException $e) {
// do something here...
throw new \RuntimeException($e->getMessage(), $e->getCode(), $e);
}
Настройка
По умолчанию CodeIgniter будет отображать все ошибки в development и testing средах и не будет отображать никаких ошибок в production среде. Вы можете изменить это, задав переменную CI_ENVIRONMENT в файле .env.
Важно
Отключение отчета об ошибках НЕ останавливает запись логов, если возникают ошибки.
Ведение логов исключений
По умолчанию все исключения, кроме исключений 404 - Страница не найдена, регистрируются в логах. Это можно включить и выключить, задав значение $log переменной Config\Exceptions:
class Exceptions
{
public $log = true;
}
Чтобы пропустить логирование для других кодов состояния, вы можете установить код состояния для пропуска в том же файле:
class Exceptions
{
public $ignoredCodes = [ 404 ];
}
Примечание
Возможно, ведение логов всё ещё не произойдёт для исключений, если текущие настройки логов не настроены на запись логов для ошибок critical, так как все исключения регистрируются как такие.
Пользовательские исключения
Доступны следующие пользовательские исключения:
PageNotFoundException
Используется для сигнализации об ошибке 404, Страница не найдена. При возникновении система покажет представление, найденное в /app/views/errors/html/error_404.php. Вы должны настроить все представления об ошибках для вашего сайта. Если в Config/Routes.php, вы указали 404 замену, она будет вызвана вместо стандартной страницы 404:
if (! $page = $pageModel->find($id)) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
Вы можете передать сообщение в исключение, которое будет отображено вместо стандартного сообщения на странице 404.
ConfigException
Это исключение следует использовать, когда значения из класса конфигурации недействительны или когда класс конфигурации не является правильного типа и т.д.:
throw new \CodeIgniter\Exceptions\ConfigException();
Это обеспечивает код HTTP статуса 500 и код выхода 3.
DatabaseException
Это исключение генерируется для ошибок базы данных, например, когда соединение с базой данных не может быть создано или когда оно временно потеряно:
throw new \CodeIgniter\Database\Exceptions\DatabaseException();
Это обеспечивает код HTTP статуса 500 и код выхода 8.
RedirectException
Это исключение — особый случай, позволяющий переопределить всю маршрутизацию ответов и принудительно перенаправить на определённый маршрут или URL:
throw new \CodeIgniter\Router\Exceptions\RedirectException($route);
$route может быть именованным маршрутом, относительным URI или полным URL. Вы также можете указать код перенаправления, который следует использовать вместо значения по умолчанию (302, «временное перенаправление»):
throw new \CodeIgniter\Router\Exceptions\RedirectException($route, 301);
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/general/errors.html