|
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
|
|
Логирование исключения для комманды саппорта + программистов10.08.2020, 19:32. Показов 1428. Ответов 7
Метки нет (Все метки)
У нас в системе есть централизованное хранилище логов - таблица LOGS. Эту таблицу используют как программисты при разработке, так и саппорты в продакшене(которым стектрейс никак не поможет). Колонки message и trace разделяют информативное сообщение и стек трейс.
Вопрос в следующем, есть такая best practice под названием throw early catch late. Когда логируешь для себя или для других программистов с этим проблем не возникает, потому что все что тебя интересует это название исключения и строчка где что-то упало. Но когда нужно также логировать с бекенда сообщение для саппорта типо "Юзер Petya не прошел валидацию, отсутствуют данные о кредитной карте за 2018 год", тогда возникает проблема, что в месте где я непосредственно могу принимать решение как обрабатывать исключение, я не могу знать что именно свалилось внутри(Петю не смогли провалидировать или Васю, например). Допустим, есть метод process() в котором я могу обработать исключение - принять решение останавливать мне джобу, которая обрабатывает файл с юзерами или нет. Этот процесс вызывает другие методы, те другие методы вызывают еще другие методы, и когда где-то глубоко что-то упадет, я не могу в process() знать что именно упало на уровне информативного сообщения, а не стектрейса. Выходит, все что мне остается, это делать catch() прямо в месте где может упасть исключение, логировать там, делать rethrow, а в process() не логировать ничего, а просто останавливать джобу если не могу дальше идти. Правильно я понимаю или можно как-то более элегантно эту проблему решить?
0
|
|
| 10.08.2020, 19:32 | |
|
Ответы с готовыми решениями:
7
Как достучаться до саппорта? Ищу программистов Cocos2d-x для разработки игр, Ищу программистов C++ |
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
| 10.08.2020, 19:59 | |
|
Если не можешь знать то, что тебе нужно, значит, очевидно, что твой код написан неправильно. Надо его переписать так, чтобы нужная информация была доступна там, где она нужна
0
|
|
|
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
|
|||||||||||
| 10.08.2020, 20:29 [ТС] | |||||||||||
|
xoraxax, задачу нужно решить в рамках проприетарного фреймворка. Фреймворк определяет метод process() в рамках которого я должен написать необходимую логику обработки файла.
То есть грубо говоря это выглядит так:
0
|
|||||||||||
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
| 10.08.2020, 20:38 | |
|
Я тебя не понимаю. Как связаны этим два фрагмента? При чем тут твой фреймворк, что ты хочешь где получить?
0
|
|
|
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
|
|
| 10.08.2020, 21:17 [ТС] | |
|
Попытаюсь абстрагироваться и привести аналогию с MVC архитектурой.
Допустим есть функционал сохранить юзера. В persistance слое мы собрали preparedStatement, но он кидает sql exception + наш JDBC драйвер не саппортит нормально preparedStatement.toString() и если мы просто залогируем исключение как оно есть, мы не будем знать какая именно вставка зафейлилась. мы хотим логировать сообщение типо "Insert failed for user with username=petya and credit card number = 88888888888". Так вот вопрос в том, что тут вроде как единственный вариант логировать прям в persistance слое + делать rethrow наверх, чтобы, например, в контроллере уже кинуть 500 ошибку и сообщение конечному юзеру "User save failed". Что противоречит правилу делать catch late. Добавлено через 1 минуту + тут прочитал: Mistake 3: Log and throw an Exception, что как по мне не учитывает моего юз кейса.
0
|
|
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
| 10.08.2020, 21:50 | |
Сообщение было отмечено korvin_ как решение
Решение
Или ты можешь кинуть свое исключение, в котором будет указана нужная информация и где то дальше его обработать и залогировать.
Я по прежнему не понимаю, что тебе не ясно, может кто то ещё поймет
0
|
|
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
||
| 11.08.2020, 11:07 | ||
|
Ну и в целом xoraxax выше написал уже. Там где падает, там надо выкидывать исключение с нужной инфой. Ловить исключение действительно чем позже, тем лучше
0
|
||
|
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
|
|||||||||||
| 11.08.2020, 13:34 [ТС] | |||||||||||
|
Думаю так и сделаю, но остается один вопрос про кастомное исключение. Если все что мне нужно, это добавить информативное сообщение к исключению, то я, получается, ничего не выигрываю от создания кастомого исключения, верно?(мне не нужно делать аггрегацию нескольких исключений, что обычно является причиной кастомного исключения) Я могу просто
0
|
|||||||||||
| 11.08.2020, 13:34 | |
|
Помогаю со студенческими работами здесь
8
@-комманды Логирование: скажется ли постоянно открытый поток для записи на скорости работы Организация собственного исключения и передача в него исходного исключения Установка Microsoft Office - логирование процесса установки для определения причины неполадок Комманды и ICommand Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|