Я столкнулся с точно таким же вопросом при написании своих собственных служб REST.
Давайте начнем с философии:
Мне нравится думать о моих приложениях как о коробке.На внутренней стороне коробки находятся все части, которые я построил, и они имеют прямой контроль.Если что-то ломается здесь, это моя вина, это должно произойти сбой, и я должен прочитать об этом в журнале ошибок.На краю коробки находятся все точки подключения к внешнему миру - им нельзя доверять.Я избегаю обработки исключений во внутренних частях и использую их по мере необходимости для внешнего края.
В аналогичных проектах, над которыми я работал:
У меня обычно около дюжины проверок пользовательского ввода.Если что-то выглядит плохо, я регистрирую это и возвращаю ошибку пользователю.Наличие трассировки стека для меня не имеет особого значения - если пользователь забыл параметр, в моем коде нет ничего, что можно было бы выследить и исправить.Я предпочел бы увидеть текстовый журнал, который говорит что-то вроде: «в 17:35 пользователь X получил доступ к пути Y, но пропустил параметр Z».
Я организую свои проверки в функции, которые возвращают ok
или {error, string()}
.Основная функция просто перебирает проверки и возвращает ok
, если все они прошли, в противном случае она возвращает первую ошибку, которая затем регистрируется.Внутри моих функций проверки я использую обработку исключений по мере необходимости, потому что я не могу рассмотреть все способы, которыми пользователи могут испортить.
Как предложено моими коллегами, вы можете альтернативно вызывать каждую проверку вместо исключенияиспользуя кортеж.
Что касается вашей реализации, я думаю, что ваша идея использования единственного обработчика исключений является хорошей, если у вас есть только одна проверка.Если вам в конечном итоге понадобится больше проверок, вы, возможно, захотите реализовать что-то, как я описал, чтобы вы могли вести более конкретные записи.