Поработав с исключениями в Java и .NET и прочитав много статей о том, как / когда / почему отлавливать исключения, я, наконец, придумал следующие шаги, которые я выполняю в своей голове, когда вижу потенциальное исключение или Исключение я должен поймать (Java) ... даже если это никогда не происходит (вздох ...). И это, кажется, работает, по крайней мере для меня:
- Что-нибудь полезное, что я могу сделать с этим исключением (кроме регистрации)? Если ответ «да», напишите код обходного пути, и если обходной путь может вызвать исключения, перейдите к 2:
- Оберните исключение вокруг исключения во время выполнения, бросьте его, перейдите к 3.
- В классе более высокого уровня, где была инициирована возможная транзакция базы данных / процесса, перехватите исключение, откатите транзакцию, сбросьте исключение.
- В классе верхнего уровня (который может быть тем, где была инициирована транзакция), зарегистрируйте исключение с помощью каркаса ведения журнала, такого как slf4j (в сочетании с log4j, например) или log4net . Если возможно, отправьте исключение по электронной почте напрямую в список рассылки, составленный разработчиками приложения.
- Если есть GUI, отобразите сообщение об ошибке, указывающее наиболее удобным для пользователя способом, что вызвало проблему; не отображать исключение / трассировку стека, пользователь не заботится и не должен знать, что это исключение NullPointerException.
Я также должен добавить шаг 0 , где я намеренно выбрасываю то, что я называю «бизнес-исключением» (новое исключение, которое я создаю, расширяя класс «Исключение»), когда некоторая сложная обработка не может быть выполнена из-за ошибок данных, НО это Известно, что это происходит, поскольку они были определены как исключительные случаи во время анализа.
За исключением части регистрации, я полностью согласен с пунктами, написанными "mikera"; Я просто добавлю, что исключение должно быть зарегистрировано один раз только .
Кроме того, шаги, которые я перечислил, могут отличаться, если вы пишете API / Framework . Там, создание хорошо продуманных исключений обязательно, чтобы помочь разработчикам понять их ошибки.
Что касается тестирования исключений, используя фиктивные объекты, вы должны иметь возможность тестировать практически все, будь то исключения или нет, при условии, что ваши классы соблюдают лучшие практики «один класс - для одной вещи». Я также лично отмечаю, что наиболее важные, но скрытые методы помечены как «защищенные», а не как «частные», чтобы я мог проверить их без особых хлопот. Кроме того, тестирование исключений является простым, просто спровоцируйте исключение и «ожидайте», что возникнет исключение, перехватывая его. Если вы не получите исключение, значит, у вас ошибка в модульном тесте.