Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
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
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2020, 19:32
Ответы с готовыми решениями:

Формы. Присваивание комманды для клавиши button
Подскажите пожалуйста. Есть форма со списком имён(ListBox). Есть две кнопки, одна отвечает за удаление, другая за добавление нового имени....

Как достучаться до саппорта?
Три месяца пишу в саппорт с интервалом письмо в неделю. Отправляю с разных мыл. Указывал разные темы, письма по разному составлял. Меня...

Ищу программистов Cocos2d-x для разработки игр, Ищу программистов C++
Привет всем. Ищу разработчиков С++ для мобильной игры (iOS, Android и WP в перспективе). Используемый движок - Cocos2d-x. Сейчас в...

7
Эксперт Java
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() в рамках которого я должен написать необходимую логику обработки файла.

То есть грубо говоря это выглядит так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class FrameworkProcessor {
    
    @Override
    public boolean process(args) {
        //write logic here
 
        if(everythingIsOk) {
            //pass job to next component
            return true;
        } else {
            //shutdown pipeline
            return false;
        }
    }
 
}
Теперь, если я буду хендлить и логировать исключения, там где я могу контролировать флоу джобы(в методе process()), то я не буду знать конкретную причину(чтобы написать информативное сообщение в терминах бизнеса):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class FrameworkProcessor {
    
    @Override
    public boolean process() {
        ...
 
        try {
            validateFile(file);
        } catch(ValidationException e) {
            //what exact business entity failed validation in the file?
            //what support team can check to handle this?
        }
 
        ...
    }
 
}
0
Эксперт Java
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
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
10.08.2020, 21:50
Лучший ответ Сообщение было отмечено korvin_ как решение

Решение

Или ты можешь кинуть свое исключение, в котором будет указана нужная информация и где то дальше его обработать и залогировать.
Я по прежнему не понимаю, что тебе не ясно, может кто то ещё поймет
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.08.2020, 11:07
Цитата Сообщение от Artmal Посмотреть сообщение
У нас в системе есть централизованное хранилище логов - таблица LOGS.
проблема начинается уже тут. Не стоит изобретать велосипед, когда есть масса готовых решений для централизированного хранения и аналитики логов
Ну и в целом xoraxax выше написал уже. Там где падает, там надо выкидывать исключение с нужной инфой. Ловить исключение действительно чем позже, тем лучше
0
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
11.08.2020, 13:34  [ТС]
Думаю так и сделаю, но остается один вопрос про кастомное исключение. Если все что мне нужно, это добавить информативное сообщение к исключению, то я, получается, ничего не выигрываю от создания кастомого исключения, верно?(мне не нужно делать аггрегацию нескольких исключений, что обычно является причиной кастомного исключения) Я могу просто
Java
1
2
3
4
5
try {
    ...
} catch(ValidationException e) {
    throw new ValidationException("Validation failed for user " + userName, e);
}
То есть использовать следующий конструктор java.lang.Exception:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
     * Constructs a new exception with the specified detail message and
     * cause.  <p>Note that the detail message associated with
     * {@code cause} is <i>not</i> automatically incorporated in
     * this exception's detail message.
     *
     * @param  message the detail message (which is saved for later retrieval
     *         by the {@link #getMessage()} method).
     * @param  cause the cause (which is saved for later retrieval by the
     *         {@link #getCause()} method).  (A {@code null} value is
     *         permitted, and indicates that the cause is nonexistent or
     *         unknown.)
     * @since  1.4
     */
    public Exception(String message, Throwable cause) {
        super(message, cause);
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2020, 13:34
Помогаю со студенческими работами здесь

@-комманды
Всем привет! Помогите плиз/ Есть вот такой код n := AuthorsID; @For( i := 1; i &lt;= @Elements(n); i := i + 1; @If ( @Contains( n...

Логирование: скажется ли постоянно открытый поток для записи на скорости работы
Здравствуйте. В программе необходимо логирование. Сделал пока так: в начале работы открыл файл, в процессе - пишу в него,а в конце работы...

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class SQLEntityException : ApplicationException ...

Установка Microsoft Office - логирование процесса установки для определения причины неполадок
В этой теме описывается,процесс логирования установки Microsof Office. 1. Нужно включить подробное введение журнала,где будет описан...

Комманды и ICommand
Привет всем. Вот сижу разбираюсь с MVVM и никак не могу понять суть работы команды. Зачем необходимо ее наследовать от ICommand и для чего...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере 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 позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru