PHP программирование → Где использовать исключения в php
В логике
1. Валидация данных: иными словами ошибка входных данных, формат поля не тот, поле не заполнено, ошибка уникальности поля — всё это ошибки входных данных, в таких случаях я бросаю эксепшн с перечислением всех полей и ошибок, которые в последствии выводятся пользователю.
2. 404 Документ не найден: Если была запрошена конкретная сущность(например строка из бд) по её индефикатору(и не только), то в случае если её нет — бросается эксепшн, который в последствии превращается в страницу 404.
3. 403 Доступ запрещён: Если была попытка доступа пользователя туда, куда ему нельзя — то кидается эксепшн(в аргументах можно передать почему нету туда доступа), который в последствии превращается в 403.
4. 401 Требуется авторизация: Пользователь запрашивает данные, куда нужна авторизация. Выкидываем эксепшн(в аргументах можем передать Relarm — текст запроса авторизации), а пользователь получает либо запрос на HTTP авторизацию, либо обычную формочку.
5. 301 Редирект: Надо редиректнуть? кидаем эксепшн — в нём передаём куда надо редиректить.
При обработке ошибок php
1. Фатальные ошибки: Тут всё понятно, нету коннекта к бд, или конфиг нельзя прочесть. Просто пишем в лог и покзывем дефейс.
2. Критические ошибки: Например: СМСка не отправляется, файл нельзя залить — кидаем специфичный эксепшн. а в нужных местах(например — подтверждение телефона), обрабатываем его и пишем пользователю то что не можем отправить смс.
При отладке
В режиме дебага использую PHP_Exceptionizer. Позволяет сделать код чище, любой нотис и варнинг превращает в эксепшн, что в свою очередь позволяет их не пропустить. Естествено это включено только в дебаг-режиме.
Рекомендую логировать все «непонятые» эксепшены:
class Controller_Front
{
// на уровне приложения
public function execute()
{
try {
...
// где то на уровне контроллера
try {
... // тут вызов основнного тела контроллера
// Захотели мы редиректнуть на хабр.
throw new Controller_RedirectException('http://habr.ru');
...
} catch (Controller_DataException $e) {
// Сохраняем ошибки и показывем их в шаблоне
$this->errors = $e->getErrors();
}
...
} catch (Controller_RedirectException $e) {
// Метод, который посылает заголовки
$this->_processRedirectException($e);
} catch (Controller_AuthException $e) {
// Метод, запрашивающий HTTP авторизацию
$this->_processAuthException($e);
} catch (Exception $e) {
// Записывем эксепшн в лог.
$this->_logException($e);
// Показывем дефейс.
$this->_processFatalException($e);
}
}
}
{
// на уровне приложения
public function execute()
{
try {
...
// где то на уровне контроллера
try {
... // тут вызов основнного тела контроллера
// Захотели мы редиректнуть на хабр.
throw new Controller_RedirectException('http://habr.ru');
...
} catch (Controller_DataException $e) {
// Сохраняем ошибки и показывем их в шаблоне
$this->errors = $e->getErrors();
}
...
} catch (Controller_RedirectException $e) {
// Метод, который посылает заголовки
$this->_processRedirectException($e);
} catch (Controller_AuthException $e) {
// Метод, запрашивающий HTTP авторизацию
$this->_processAuthException($e);
} catch (Exception $e) {
// Записывем эксепшн в лог.
$this->_logException($e);
// Показывем дефейс.
$this->_processFatalException($e);
}
}
}



