Как правильно организовать обработку ошибок на PHP?

Занялся вопросом обработки ошибок в своем приложении. Читаю статьи на эту тему, как вообще принято обрабатывать ошибки и т.д. Заодно изучил механизм исключений. В итоге у меня возник один принципиальный вопрос. Вопрос общего, я бы даже сказал, понятийного плана.
Когда специалисты рекомендуют использовать механизм генерации исключений (речь идет о php), т.е. использование try – catch, то говорят, что код, в котором может возникнуть проблема или ошибка, нужно помещать в оператор try и генерировать исключение. Правильно я понимаю, что речь идет о тех местах кода, где вероятно возникновение ошибки, независящей от программиста, ну например открытие файла, которого может не существовать или подключение к базе данных, сервер которой может быть не доступен. В этих случаях советуют генерировать исключения, чтобы, как я понял, не пугать пользователя сайта php-шными сообщениями об ошибках, а выводить свои «дружественные» сообщения.
Вопрос в следующем: многие советуют писать все ошибки в лог. О каких ошибках идет речь? Именно о тех, для которых мы генерируем исключения? Или же другие ошибки типа всяких Warning-ов и Notice-ов (например, деление на 0, использование не обьявленной переменной и т.д.). Эти ошибки надо писать в лог, чтобы потом он помогал программисту разобраться с проблемами?
Вообще существуют ли какие-нибудь традиционные схемы обработки ошибок для php?
  • Вопрос задан
  • 5706 просмотров
Решения вопроса 2
shaks
@shaks
Ошибки в лог надо писать все

Вот простой быдлокодинг логирования ошибок. В лог попадает абсолютно всё, даже "засобаченное".
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
set_error_handler("errorsLog");

function errorsLog($errno, $errmsg, $file, $line)
{
    $fp=fopen('log.txt', 'a+');
    fwrite($fp, "errno: $errno\ntext: $errmsg\nfile: $file\nline: $line\n (".date("r").") \n===========================================\n\n");
    fclose($fp);
}


Самому туда посылать ошибки можно функцией trigger_error()
Ответ написан
Комментировать
Внесу немного ясности:
- Есть ошибки и есть исключения - это два разных подхода.
- Т.к. PHP не везде использует исключения, то нужно мониторить ошибки.
- Т.к PDO и многие другие модули используют исключения, то их тоже нужно мониторить.
- Логировать ошибки и исключения нужно всегда, чтобы своевременно исправлять баги.
- Логи проще всего (и лучше всего) писать в файлы. Можно использовать несколько файлов (я лично разделяю на ошибки PHP и исключения работы с БД).
- Как это выглядит в коде выше написали
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
miraage
@miraage
Старый прогер
Например.

<?php

// Any expression you want
define('IN_DEV', $_SERVER['REMOTE_ADDR'] === '127.0.0.1');

error_reporting(-1);
ini_set('display_errors', IN_DEV);

/**
 * Error handler
 *
 * @param int $severity Errno
 * @param string $msg Errstr
 * @param string $file Errfile
 * @param int $line Errline
 * @throws ErrorException
 */
function errhandler($severity, $msg, $file, $line)
{
    if (error_reporting() & $severity) {
        throw new ErrorException($msg, 0, $severity, $file, $line);
    }
}

/**
 * Exception handler
 *
 * @param Exception $e
 */
function exceptionHandler($e)
{
    if (IN_DEV) {
        // show error for developer
        echo $e->getMessage(), '<pre>', $e->getTraceAsString(), '</pre>';
    } else {
        // log error
        // file, database, whatever
    }
}

set_error_handler('errhandler', error_reporting());
set_exception_handler('exceptionHandler');
Ответ написан
@GoldCode
set_error_handler(function ($err_no, $err_msg, $file, $line) {
    $telegram = new Telegram();
    $telegram->sendErrorToAdmin("\nerrNo: $err_no\ntext: $err_msg\nfile: $file\nline: $line\n\n");
});


:)
Ответ написан
Комментировать
AlexPTS
@AlexPTS
Full stack веб разработчик
Ну и set_exception_handler по аналогии
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
В дополнение к предыдущим ответам, познайте замечательный Monolog
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы