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