Можно ли создать собственное исключение без трассировки стека? - PullRequest
2 голосов
/ 14 июля 2020

В моем приложении я использую AngularJS в качестве внешнего интерфейса и Java как серверную часть. Всякий раз, когда мне нужно показать настраиваемую ошибку на передней панели, я выбрасываю из Java с помощью Custom Exception, а в Angular я получаю это как ответ и создаю сообщение с помощью javascript. Это настраиваемое исключение является распространенным, поэтому в журнале сервера фиксируется вся трассировка стека. Я в ситуации, когда должен быть throw, а трассировка стека не должна печататься. Я ДУМАЛ УЛОВИТЬ. Но после выброса он продолжает транзакцию, когда ей действительно нужно остановиться после выброса. Это очень сложный код, который я вставляю только один раз, когда это необходимо. день в журнале сервера. Все, что мне нужно, это одна первая строка для печати в журнале сервера. то есть

 com.abc.def.exceptions.ReservationException: Exception thrown with error codes :5965

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

Ответы [ 3 ]

3 голосов
/ 14 июля 2020

Вы уже используете spring mvc (см. Трассировку стека, содержащую классы spring mvc)

Если это так, вероятно, лучшим вариантом будет перехват исключения на уровне Contoller Advice или любой другой механизм обработки исключений , поддерживаемый spring MVC.

Обычно трассировка стека печатается самим механизмом spring mvc, только если никто (контроллер, совет или, возможно, служба)

Однако с точки зрения angular исключений не существует. Вместо этого вы получаете статус не 200 с некоторым значением по умолчанию JSON, это ответ в формате HTTP, а не исключение, а просто ответ определенного типа c. Поэтому я считаю, что лучше всего было бы установить sh какой-то протокол для сообщений, которые приходят на клиентскую сторону, и ясно, что трассировка стека сервера не является чем-то, что нужно отправлять клиенту.

Это своего рода соглашение которые могут включать:

  1. статус HTTP (не 200, чтобы различать ошибки и обычные ответы)
  2. сообщение JSON в предопределенном формате с:
  • Идентификатор исключения
  • Время на сервере
  • Сообщение
  • Параметры, которые будут отображаться на клиенте
  • Информация, связанная с I18n, если она актуальна для вашего приложения.

Вкратце:

  • Вы создаете совет контроллера и сопоставляете там настраиваемое исключение
  • Метод сопоставления создаст «протокол» json и вернет это в angular.
  • Этот метод сопоставления будет вызываться Spring автоматически, если никто раньше не поймал исключение.
  • Так как метод сопоставления будет обрабатывать исключение, он не будет быть напечатанным на консоли сервера, чего вы и пытаетесь достичь.
  • Клиент получит json и создаст некоторый "инфраструктурный" код в angular, который обрабатывает все сообщения (возможно, показывает сообщение в верхней части экрана, все всплывающее).
1 голос
/ 14 июля 2020

Вы можете заменить stacktrace на пустой массив.

public ReservationException(String message, List<GenericException> failedValidations) {
    super(message);
    this.setStackTrace(new StackTraceElement[0]);

    // Alternative: Keep the method where the exception was thrown.
 // this.setStackTrace(Arrays.copyOf(this.getStackTrace(), 1)); 
}

будет печатать

com.abc.def.exceptions.ReservationException: Exception thrown with error codes :5965

только при вызове Throwable::printStackTrace().

Но это определенно лучше сконфигурировать ваш регистратор или пружину, чтобы не печатать трассировку стека, как предлагал Марк Брамник , поскольку вы теряете ценную информацию для устранения неполадок, удаляя трассировку стека.

0 голосов
/ 14 июля 2020

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

https://www.baeldung.com/exception-handling-for-rest-with-spring

...