Предварительные условия Guava Обработка исключений RuntimeExceptions
Как я понял, мы используем предварительные условия Guava для быстрого сбоя перед изменением некоторых состояний объектов (хороший ответ здесь от stackru). И это хорошо. Однако он генерирует исключения Runtime, и это не любимые исключения для пользователя приложения (500 ошибок и т. Д.). Поэтому мне нужно, чтобы вы помогли мне с дизайном.
У меня есть интерфейс, который объявляет много методов. У каждого метода есть аргументы, которыми нужно управлять (например, не ноль). Поэтому в классе реализации я использую инструкции, подобные следующим:
Preconditions.checkNotNull(fooObj);
Однако программа, вызывающая этот API, может аварийно завершить работу из-за исключительной ситуации во время выполнения, то есть в данном случае NullPointerException.
Итак, как вы справляетесь с этими непроверенными исключениями?
Спасибо.
-------- РЕДАКТИРОВАТЬ Слои приложения:
Уровень доступа к данным
API объявляет методы, которые обмениваются DTO
Процесс реализации API и проверки аргументов с использованием Guava
Веб-сервис в зависимости от уровня процесса
2 ответа
Сбой предварительного условия означает, что в вашей программе есть ошибка. Пользователи не должны сталкиваться с ними, если они не нашли ошибку в вашей программе.
Ваша программа в целом должна показывать какое-то сообщение об ошибке пользователям в случае ошибки, но, более того, вы должны быть проинформированы, чтобы вы могли исправить ошибку в первую очередь.
Вы справляетесь с ними, разрабатывая свою программу, чтобы они никогда не происходили. Эти предварительные методы предназначены для обнаружения ошибок и помогают точно определить причину, а не для проверки ввода пользователя.
Если вы определяете только API, а не программы, которые его вызывают, то вы "обрабатываете" его, говоря людям в своей документации, что рассматриваемые аргументы не должны быть нулевыми, и оставляете проблему удовлетворения этого требования для них.
Если вы также пишете вызывающую программу, сначала постарайтесь убедиться, что исключение просто никогда не произойдет. Вы также можете позвонить в try/catch
блок, чтобы поймать NullPointerException
, но цель блока catch должна состоять в том, чтобы дать вам лучшее уведомление об ошибке (например, записать сообщение в журнал или вызвать предупреждение) и обстоятельствах запуска, и, возможно, отключиться более изящно или дать более понятное сообщение об ошибке. Попытка восстановиться после сбоя должна быть сделана с большой осторожностью или вообще не предприниматься - если произошел сбой такого рода, значит, что-то пошло не так, как вы не предвидели, и правильный способ восстановления может быть непредсказуемым.