Исключения полезны во множестве обстоятельств.
Во-первых, есть некоторые функции, в которых стоимость вычисления предварительного условия настолько высока, что лучше просто выполнить вычисление и прервать выполнение с исключением, если обнаружится, что предварительное условие не выполнено. Например, вы не можете инвертировать сингулярную матрицу, однако, чтобы вычислить, является ли она сингулярной, вы вычисляете определитель, что очень дорого: в любом случае это может быть сделано внутри функции, поэтому просто «попробуйте» инвертировать матрицу и сообщить ошибка, если вы не можете выбросить исключение. Это в основном исключение как отрицательное предварительное условие. .
Есть и другие случаи, когда ваш код уже сложен и передача информации об ошибках вверх по цепочке вызовов затруднена. Отчасти это связано с тем, что C и C ++ имеют сломанные модели структур данных: есть другие, более эффективные способы, но C ++ не поддерживает их (например, использование монад в Haskell). Это использование в основном я не мог беспокоиться о том, чтобы сделать это правильно, поэтому я выброшу исключение : это не правильный путь, но он практичный.
Затем есть основное применение исключений: чтобы сообщить, когда внешние предварительные условия или инварианты, такие как достаточные ресурсы, такие как память или дисковое пространство, недоступны. В этом случае вы обычно завершаете программу или ее основную часть, и исключением является хороший способ передачи информации о проблеме. Исключения C ++ были разработаны для сообщения об ошибках, препятствующих продолжению работы программы .
Модель обработки исключений , используемая в большинстве современных языков , включая C ++ является известным разбиться. Это слишком мощно. К настоящему времени теоретики разработали более совершенные модели, чем полностью открытая модель «бросить что-нибудь» и «может быть, а может и не поймать». Кроме того, использование информации о типе для классификации исключений было не очень хорошей идеей.
Поэтому лучшее, что вы можете сделать, - это экономно генерировать исключения, когда есть реальная ошибка, и когда нет другого способа справиться с ней и перехватывать исключения как можно ближе к точке выброса .