→

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);
    }
  }
}
0