Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Обработка ошибочных ситуаций в PHP

"Если человек может сделать ошибку, он ее сделает. Если же вы полагаете, что ошибку в данной ситуации совершить невозможно, то вы ошибаетесь".

В PHP все виды ошибок и предупреждений разбиты на несколько категорий:

КонстантаОписание
E_ALLВсе типы ошибок
E_ERRORФатальная ошибка на этапе исполнения
E_WARNINGПредупреждение на этапе исполнения (нефатальная ошибка)
E_PARSEОшибка синтаксиса
E_NOTICEЗамечание на этапе исполнения (менее серьезное, чем предупреждение)
E_CORE_ERRORФатальная ошибка на этапе инициализации PHP-машины
E_CORE_WARNINGПредупреждение на этапе инициализации PHP-машины (нефатальная ошибка)
E_COMPILE_ERRORФатальная ошибка на этапе компиляции
E_COMPILE_WARNINGПредупреждение на этапе компиляции (нефатальная ошибка)
E_USER_ERRORГенерируемое пользователем сообщение об ошибке
E_USER_WARNINGГенерируемое пользователем предупреждение
E_USER_NOTICEГенерируемое пользователем замечание

Стандартное значение режима генерации сообщений об ошибках равно E_ALL & ~E_NOTICE, что соответствует выводу всех сообщений, не относящихся к категории E_NOTICE.

Это значение может быть изменено

  • в инициализационном файле php.ini с помощью директивы error_reporting;
  • в конфигурационном файле Apachehttpd.conf с помощью директивы php_error_reporting;
  • во время выполнения программы с помощью функции error_reporting().

Функция настройки системного журнала error_reporting() устанавливает уровень выводимых соообщений об ошибках. Этой функции передаются константы, описанные выше.

Обработка исключений (exception)

Обработать возникающие исключения можно с помощью конструкции:

try{
    // код, который может выбросить исключение
}catch(Exception $ex){ //$ex - экземпляр класса Exception или его наследника
    echo 'Исключение: ' . $ex->getMessage();
}

Методы исключений

  • getMessage() – получает сообщение исключения;
  • getCode() – возвращает числовой код, который представляет исключение;
  • getFile() – возвращает файл, в котором произошло исключение;
  • getLine() – возвращает номер строки в файле, где произошло исключение;
  • getTrace() – возвращает массив backtrace() до возникновения исключения;
  • getPrevious() – возвращает исключение, произошедшее перед текущим, если оно было;
  • getTraceAsString() – возвращает массив backtrace() исключения в виде строки;
  • __toString() – возвращает все исключение в виде строки. Данную функцию можно переписать.

PHP позволяет использовать свой обработчик исключений. Для этого необходимо объявить собственную функцию обработки и зарегистрировать её при помощи функции set_exception_handler().

function special_handler($exception) {
    echo "log: " . $exception->getMessage() . "\n";
}

set_exception_handler('special_handler');

// имитируем исключение
throw new Exception('Пример исключения');

После этого все возникающие исключения, не обрамлённые конструкцией try...catch, будут передаваться в объявленную вами функцию. Например, можно изменить функцию, чтобы она писала все исключения в файл и выдавала пользователю в браузер "красивое" сообщение об ошибке сервера:

function special_handler($exception) {
    // добавляем описание исключения в лог-файл
    $file = fopen("logfile.log", "a+");
    fwrite($file, $exception->getMessage() . "\n");
    fclose($file);

    // выводим пользовалелю понятное сообщение
    echo "Обнаружена ошибка сервера. Попробуйте ".
        "войти позже. Приносим свои извинения.";
}

Эта функция очень полезна в процессе отладки скриптов непосредственно на сервере.

Функции, применяемые для обработки ошибок

  • connection_aborted() - возвращает значение true при отключении клиента. Обычно это происходит в результате щелчка на кнопке "Остановить" ("Stop") в окне пользовательского браузера.
  • connection_timeout() - возвращает значение true в случае тайм-аута сценария.
  • defined() - возвращает значение true, если заданный аргумент является существующей именованной константой.
  • die() - выводит сообщение и прекращает выполнение сценария.
    if ( !file_exists( "aaa.php" ) ) die "Файл aaa.php не найден!";
    
  • eval() - выполняет строку как PHP-код. Строка должна соответствовать обычным требованиям к PHP-коду. Все переменные, созданные в этом коде, после выполнения функции продолжают существовать в основном коде.
  • exit() - прекращает выполнение сценария.
  • func_get_args() - возвращает массив аргументов текущей функции пользователя. Базовое значние счетчика массива - нуль. При вызове вне рамок функции пользователя генерируется предупреждение.
  • func_num_args() - возвращает количество аргументов текущей функции пользователя. Базовое значние счетчика массива - нуль. При вызове вне рамок функции пользователя генерируется предупреждение.
  • function_exists() - возвращает значение true, если заданный аргумент - определенная функция.
  • extension_loaded() - возвращает значение true, если загружено расширение с именем, заданным параметром.
  • phpinfo() - выводит сведения о текущем состоянии PHP.
  • phpversion() - возвращает версию выполняемой в данный момент программы синтаксического анализа PHP. Например, 4.3.0RC2.
  • php_logo_guid() - возвращает глобальный идентификатор регистрационных данных (logo).
  • php_sapi_name() - возвращает тип интерфейса, обеспечивающего взаимодействие Web-сервера и PHP. Например, cgi или apache.
  • set_time_limit() - устанавливает количество секунд допустимой продолжительности выполнения сценария. По умолчанию ограничение составляет 30 секунд. Если парамер функции имеет нулевое значение, то ограничение по времени отсутствует. Если PHP выполняется в безопасном режиме, функция set_time_limit() не дает эффекта.

Читать дальше: Дополнительные возможности PHP.

Смотрите также Отладка PHP программ.