Как правильно использовать исключения 
Как-то я имел неосторожность утверждать, что разработчику необходимо самому обрабатывать порожденные им исключения, а не надеяться, что это за него сделают коллеги. Моя позиция несколько поменялась с тех пор, и я еще раз хочу вернуться к этому вопросу.
В первую очередь хочу отметить, что как и раньше я считаю исключение довольно сложным инструментом, который имеет целый ряд ограничений. Очень хорошо про исключения в своей книге “Совершенный код” сказал Стив Макконнелли:
Исключения и наследование имеют общее свойство: используемые разумно, они могут уменьшить сложность. Используемые чрезмерно, они могут сделать код абсолютно нечитаемым
В этой же книге даны хорошие рекомендации о том, как следует правильно использовать исключения при написании программ. Позволю себе привести основные тезисы:
- Используйте исключения для оповещения других частей программы об ошибке, которую нельзя игнорировать;
- Генерируйте исключения только для действительно исключительных ситуаций;
- Не используйте исключения по мелочам;
- Избегайте использовать исключения в конструкторах и деструкторах, если только вы не перехватываете их позднее;
- Вносите в описание исключения всю информацию о его причинах;
- Выясните, какие исключения генерирует используемая библиотека;
- Стандартизируйте использование исключений в вашем проекте;
- Рассмотрите альтернативы исключениям;
- Генерируйте исключения на правильном уровне абстракции.
Более подробно хочется остановиться на последнем пункте приведенных рекомендаций. Когда в прошлый раз мы обсуждали тему исключений была высказана правильная мысль, что при написании библиотеки разработчик не может обрабатывать свои собственные исключения, так как не знает, каким образом она будет использоваться в будущем.
Я не спорю с этим утверждением, но хочу обратить внимание, что библиотеки как правило используются на самом низком уровне абстракции, а значит и исключения, которые они генерируют, должны обрабатываться на том же уровне абстракции, а не уходить на уровень выше. Поэтому исходя из моей мысли, что каждый должен убирать за собой сам - то есть обрабатывать свои исключения, считаю, что если вы используете какую-либо библиотеку в своем проекте, то соответственно несете ответственность за обработку ее исключений. В худшем случае можно перехватить исключения низкого уровня и обернуть его в исключение более высокого уровня абстракции. Тогда разработчики, работающие с кодом более высокого уровня, не будут себе ломать голову над тем, как обработать ошибки файловой системы и тому подобных вещей.
И последнее, если вы решили использовать исключения в своих проектах, то их следует очень хорошо задокументировать, чтобы всегда можно было легко найти информацию о том, какие ошибки могут возникать в процессе работы вашего кода.
И в любом случае, нужно пытаться обрабатывать все исключения относящиеся к вашей части проекта, даже если они были “брошены” не вами. В противном случае их придется обрабатывать тому, кто ничего не знает о вашем коде. Обычно в таких случаях информация об исключении просто подавляется.
подписаться на блог
Leave a Reply