// codeart.ru / Вопрос/Ответ / Как правильно использовать исключения Форум

Как правильно использовать исключения rss подписка

Автор: Evgeniy Sergeev

Как-то я имел неосторожность утверждать, что разработчику необходимо самому обрабатывать порожденные им исключения, а не надеяться, что это за него сделают коллеги. Моя позиция несколько поменялась с тех пор, и я еще раз хочу вернуться к этому вопросу.

В первую очередь хочу отметить, что как и раньше я считаю исключение довольно сложным инструментом, который имеет целый ряд ограничений. Очень хорошо про исключения в своей книге «Совершенный код» сказал Стив Макконнелли:

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

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

  1. Используйте исключения для оповещения других частей программы об ошибке, которую нельзя игнорировать;
  2. Генерируйте исключения только для действительно исключительных ситуаций;
  3. Не используйте исключения по мелочам;
  4. Избегайте использовать исключения в конструкторах и деструкторах, если только вы не перехватываете их позднее;
  5. Вносите в описание исключения всю информацию о его причинах;
  6. Выясните, какие исключения генерирует используемая библиотека;
  7. Стандартизируйте использование исключений в вашем проекте;
  8. Рассмотрите альтернативы исключениям;
  9. Генерируйте исключения на правильном уровне абстракции.

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

Я не спорю с этим утверждением, но хочу обратить внимание, что библиотеки как правило используются на самом низком уровне абстракции, а значит и исключения, которые они генерируют, должны обрабатываться на том же уровне абстракции, а не уходить на уровень выше. Поэтому исходя из моей мысли, что каждый должен убирать за собой сам — то есть обрабатывать свои исключения, считаю, что если вы используете какую-либо библиотеку в своем проекте, то соответственно несете ответственность за обработку ее исключений. В худшем случае можно перехватить исключения низкого уровня и обернуть его в исключение более высокого уровня абстракции. Тогда разработчики, работающие с кодом более высокого уровня, не будут себе ломать голову над тем, как обработать ошибки файловой системы и тому подобных вещей.

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

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

Leave a Reply

« »