Как обнаружить исключение logic_error перед временем выполнения? - PullRequest
0 голосов
/ 31 августа 2018

C ++ стандарт говорит, что logic_error может обнаружить до выполнения пока runtime_error обнаруживает во время выполнения.

а как это работает? Мой вопрос заключается в том, как обнаружить logic_error перед выполнением. не могли бы вы привести пример? спасибо за помощь ~!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

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

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 не идеальная вещь, чтобы бросать сюда, поэтому, пожалуйста, возьмите пример с крошкой соли.

0 голосов
/ 31 августа 2018

Стандарт C ++ говорит это о logic_error (§22.2.2):

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

Это не означает, что исключение может быть перехвачено во время компиляции. Это означает, что причина исключения может быть обнаружена другими способами (предупреждения компилятора, анализ кода и т. Д.) Во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...