Я думаю, что ваше недоразумение между тем, что вызывает исключение, и самим исключением. Существуют исключения, которых нельзя избежать даже в полностью безошибочной программе, например, вызванные пользовательским вводом. Тогда есть другие исключения, которые явно вызваны написанием логически неверного кода. Рассмотрим эту функцию:
double sqrt(double x); // takes only positive numbers
Теперь, если я использую эту функцию следующим образом:
double y = sqrt(-2);
тогда я сделал логическую ошибку. Я не соблюдаю предварительные условия для параметра для функции. В таком случае может быть правильным (*) сделать для sqrt бросок std::logic_error
(в отличие от простого runtime_error
).
double sqrt(double x) {
if (x < 0) throw std::logic_error();
//....
Теперь, когда вы читаете где-то, что «логические ошибки могут быть обнаружены до выполнения», это, скорее всего, относится к тому факту, что можно прочитать код и увидеть, что вызов sqrt(-2)
действительно неправильный и исправить его. Однако обратите внимание, что это не связано с фактическим генерируемым исключением (которое является чисто концепцией времени выполнения).
Итак, чтобы ответить на ваш вопрос буквально: вы обнаруживаете логические ошибки в вашем коде путем тщательного анализа. Обратите внимание на предупреждения компилятора, попросите коллег по проверке, используйте инструменты статического анализа и т. Д.
(*) = может быть logic_error
не идеальная вещь, чтобы бросать сюда, поэтому, пожалуйста, возьмите пример с крошкой соли.