Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 22

Уровни исключений и логирование

27.04.2019, 20:33. Показов 4619. Ответов 5

Студворк — интернет-сервис помощи студентам
Мне нужно разработать систему интеграции с различными информационными системами.

В процессе разработки будут случаи, когда в непредвиденных ситуациях требуется отправлять уведомления по почте, в других случаях записывать информацию в журнал или отправлять SMS в критических ситуациях.

Для логирования и других уведомлений я выбрал Monolog (только знакомлюсь с монологом).

Вопрос в том, как мне организовать работу Exception, так, чтобы существовали разные уровни исключений и выполнялись соответствующие действия (запись логов в журнал и т. Д.)?

Я искал информацию в разных источниках, нашел несколько статей о работе с исключениями (статья на habr).

UnloggedInterface - все необработанные ошибки регистрируются по умолчанию. Этот интерфейс отмечает, Exceptionsчто не нужно регистрироваться вообще.

PreloggedInterface - этот интерфейс помечает исключения, которые в любом случае необходимо регистрировать: не имеет значения, обрабатываются они или нет.

OutableInterface - этот интерфейс помечает исключения, текст которых может быть передан пользователю.

Я не понимаю, какой должна быть иерархия наследования Exception классов? Каким образом нужно связать Monolog (или любую другую систему логирования) с классами исключений ?

Может нужно использовать Monolog\ErrorHandler ? (но я не знаю как) ..

Подскажите пожалуйста, где я могу посмотреть примеры? Или где почитать об этом подробнее?

Я хотел бы понять, как это работает. И посмотрите примеры правильной работы с исключениями и логами.

Можно даже примеры на GitHub))

Буду благодарен за любую помощь.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2019, 20:33
Ответы с готовыми решениями:

Все уровни в PHP
Привет я знаю основы php, и где то слышал что в php есть 5 уровней не могли бы вы мне их все перечислить . Вроде так - 1 уровень - это...

Логирование действий юзера
Доброго времени, форумчане! Посоветуйте пожалуйста, хочу сделать логирование действий юзера. Встал вопрос - сделать это занесением в БД...

Логирование запросов, вернувших ошибку 404
Здравствуйте, как получить при ошибке 404 запрашиваемый сайт? Т.е. кто-то вводить несуществующий url переходит на мою страницу error (это...

5
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
27.04.2019, 23:38
Цитата Сообщение от SystemException Посмотреть сообщение
как мне организовать работу Exception, так, чтобы существовали разные уровни исключений
Проблема в том, что одно и то же исключение может иметь разные уровни ошибок в зависимости от контекста.

К примеру, у нас есть код создания товара, который может выбросить ValidationException:

PHP
1
2
3
$product->name = 'Смартфон Samsung';
$product->price = 1000;
$product->save();
Если ошибка произошла потому что юзер ввёл что-то не то в админке - можно не логировать, просто показать юзеру сообщение с ошибкой. Если ошибка произошла при выкачивании товаров парсером - надо логировать. Если ошибка произошла во время синхронизации с другой базой - можно и e-mail отправить.

Мне больше нравится, когда критичность ошибки определяется уровнем выше. Если грузчик Вася разбил 10 ящиков водки - его начальник определяет, насколько это плохо и что делать дальше.

К слову, у монолога уже есть свои уровни ошибок, можно отталкиваться от них.

PHP
1
2
3
4
5
6
7
8
9
try {
    $product->name = 'Монитор Dell';
    $product->save();
} catch (\App\ValidationException $e) {
    // Показываем ошибку юзеру
} catch (\App\SomeOtherException $e)
{
    $this->monolog->error('Ошибка: ' . $e->getMessage());
}
Если происходит какая-то другая ошибка - ловим её с помощью set_exception_handler и логируем с более высоким уровнем.

PHP
1
2
3
4
5
6
7
set_exception_handler(function ($exception) {
    
    // Достаём монолог из IOC-контейнера или откуда-нибудь ещё
    $monolog = \App::get('monolog');
 
    $monolog->critical('Критическая ошибка: ' . $e->getMessage());
});
Кстати, не забудьте про обычные и фатальные ошибки, их тоже надо обрабатывать.

Добавлено через 4 минуты
Цитата Сообщение от Jodah Посмотреть сообщение
PHP
1
2
3
$this->monolog->error
...
$monolog->critical
Забыл один момент. Монолог позволяет вешать для каждого уровня ошибок свой обработчик (handler). Т.е. можно сделать так, что $monolog->error() будет записывать логи в файл, а $monolog->critical() отправлять уведомления. Не знаю, есть ли хендлеры для СМС-сервисов, но, в любом случае, несложно написать свой, примеры в документации есть.
1
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 22
28.04.2019, 00:41  [ТС]
Jodah, спасибо большое!

понял, почему не стоит использовать интерфейсы.


Мне больше нравится, когда критичность ошибки определяется уровнем выше.
можете пожалуйста подробнее описать, что значит уровнем выше? И как было бы, если не делать уровнем выше? Не совсем понял, что имеется ввиду, и как это выглядит на практике.


Правильно понимаю, что систему оповещений (логирование и т.п) нужно вызывать в момент обработки исключения в блоке catch, а не в момент выбрасыванию исключения - перед throw?


Если происходит какая-то другая ошибка - ловим её с помощью set_exception_handler и логируем с более высоким уровнем.
с этим тоже понял, спасибо!

Смотрю документауию Монолога, нашел метод registerExceptionHandler у класса Monolog\ErrorHandler, я так понимаю это аналог set_exception_handler ? Если да, не подскажите как его использовать ? В документации не могу найти примера..


Я с Monolog только начинаю знакомиться, не понимаю в каком месте нужно (возможно есть какие-то событие ?) смотреть, через какой метод пришел лог (т.е. какой у него уровень) и выполнять те, или иные действия?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
28.04.2019, 02:10
Лучший ответ Сообщение было отмечено SystemException как решение

Решение

Цитата Сообщение от SystemException Посмотреть сообщение
что значит уровнем выше? И как было бы, если не делать уровнем выше?
Под уровнем выше имею ввиду это:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class ProductController
{
    public function action_save()
    {
        try {
            $product = new \App\Product();
            $product->name = $_POST['name'];
            $product->save();
        } catch (\SomeException $e) {
            $this->monolog->error('Error: ' . $e);
        }
    }
}
Т.е. когда тот, кто запустил этот код (в нашем случае ProductController), сам решает, что делать в случае ошибки.

Если не на уровень выше, то, например, так:

PHP
1
2
3
4
5
6
7
8
9
class MyException extends Exception
{
    public function __construct($message, $code = 0, Exception $previous = null) {
        $monolog = \App::get('monolog');
        $monolog->error($message);
        
        parent::__construct($message, $code, $previous);
    }
}
Получается, исключение само себя обрабатывает. Мне такой подход не очень нравится.

Цитата Сообщение от SystemException Посмотреть сообщение
Правильно понимаю, что систему оповещений (логирование и т.п) нужно вызывать в момент обработки исключения в блоке catch
Да.

Цитата Сообщение от SystemException Посмотреть сообщение
я так понимаю это аналог set_exception_handler ?
Да, там внутри как раз set_exception_handler запускается.

Цитата Сообщение от SystemException Посмотреть сообщение
не подскажите как его использовать ?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
include 'vendor/autoload.php';
 
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\ErrorHandler;
 
$logger = new Logger('name');
$logger->pushHandler(new StreamHandler('logs.log'));
 
ErrorHandler::register($logger);
 
// Пытаемся подключить несуществующий файл - в логи добавляется новая запись
include 'some-file-name.txt';
 
// Бросаем исключение, в логи добавляется новая запись
throw new \Exception('test');
Цитата Сообщение от SystemException Посмотреть сообщение
в каком месте нужно (возможно есть какие-то событие ?) смотреть, через какой метод пришел лог (т.е. какой у него уровень)
Это система делает сама. Вам нужно только добавлять обработчики (handlers). Например, StreamHandler записывает логи в файл, SwiftMailerHandler отправляет почту и т.п.

При создании обработчика вторым параметром указывается минимальный уровень ошибки, при котором он будет запускаться. Например, если сделать так:
PHP
1
2
3
4
5
$logger = new Logger('name');
$logger->pushHandler(new StreamHandler('logs.log', Logger::WARNING));
 
$logger->debug('test');
$logger->info('test');
В логи ничего не запишется потому что info и debug ниже уровнем, чем warning.
2
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 22
28.04.2019, 10:51  [ТС]
Jodah, спасибо большое, все подробно разложили по полочкам, все понятно!

Единственное, вы упомянули про IOC-контейнеры, тоже пытался освоить в процессе работы, не получалось..
Но это создам другую тему.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
28.04.2019, 11:28
SystemException, я использую контейнер из Laravel, по нему есть неплохая статья на хабре.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2019, 11:28
Помогаю со студенческими работами здесь

Обработка исключений. Как организовать общий обработчик исключений?
У меня есть последовательность вызова методов для внесения данных в таблицу БД. Сам метод внесения данных. Он генерирует исключение ...

Обработка исключений с пмощью структурированной обработки исключений
Есть функция, которая определенным образом работает с файлами,но при работе с файлами "не подходящего" типа вызывается...

Уровни отладки
Всем доброго дня ! Подскажите пожалуйста почему при выполнении строки #if DEBUGLEVEL < HIGH я получаю на экран сообщение от ...

Уровни страниц
Добрый вечер, незнаю в верный ли я топик задал вопрос, надеюсь да. Можете объяснить(на примере), что значит страница второго уровня или...

Уровни системы.
Вобщем я просто не знал куда обратиться вот и решил податься на форум сисадминов... но тут тоже не знал куда запихнуть тему... не судите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru