Передача ошибок в Clojure Ring REST-like API?


Мне было интересно, что люди считают хорошим способом обработки ошибок в api REST-стиля, написанном в Clojure, используя библиотеку Ring.

Один подход Павел Амберы в его в Clojure спокойного API учебник, чтобы позволить исключение произойдет естественно и позволить им пузырь все, вплоть до куска специализированных промежуточного превращения исключения в определенных кодах состояния HTTP.

В основном, ограничения БД будут порождать свои собственные специфические ошибки (например, PSQLException), валидаторы моделей будут подбрасывать другой тип, все под зонтиком кода 400. Неизвестные исключения будут перехвачены универсальным обработчиком исключений и вернут код 500.

Несколько мыслей:

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

Спасибо!

1 4

1 ответ:

Я ни в коем случае не эксперт в этой конкретной области, но поскольку никто еще не взвешивал, я дам свои два цента.

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

Итак, к вашему первому вопросу: возможно, вы могли бы адаптировать свою систему больше к данному конкретному случаю использования, но как схема обработки ошибок общего назначения, это кажется довольно хорошим. В этом нет ничего такого, что бросается мне в глаза как прямолинейное "неправильно".

К вашему второму вопросу: это плохая практика, чтобы поймать общий тип Exception, когда вы знаете, что ищете более конкретный, потому что вы хотите избежать смешивания ожидаемых и неожиданных ошибок. Если вы знаете, что есть возможность MissingResourceException Когда вы выполняете поиск пакета, вы не хотите, чтобы ваш обработчик исключений для этого случайно похоронил NullPointerException, возникающий из реальной ошибки в вашем коде.

В этом случае, однако, я бы сказал, что ловить общий тип Exception - это именно то, что нужно делать. Вместо обработки конкретных условий, таких как MissingResourceException, Цель этого обработчика верхнего уровня состоит в том, чтобы поймать все, что ваша логика приложения не делает и преобразовать его в информацию об ошибке это имеет значение для клиента вашего API. Это своего рода последняя линия обороны между вашей реализацией и ее потребителем на другом конце.