Обработка исключения в Visual Studio 2019 - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь обработать исключение в Visual Studio Community 2019, обратите внимание, что я не уверен, есть ли у меня ошибка с моими настройками или это из-за моего кода.

Исключение, которое я пытаюсь для обработки - out_of_range. Чтобы сделать это, я помещаю его в блок try и catch, но я не могу справиться. Когда программа запускается, появляется окно: Debug Assertion Failed! Индекс вектора выражения вне допустимого диапазона

#include <iostream>
#include <vector>
#include <stdexcept>

using namespace std;
int main() {


    try {
        cout << "throwing exception: \n";
        throw 1;
    }
    catch (int i) {
        cout << "exception happended!\n";
    }
    cout << "out of exception\n";
    vector<int> v;
    try {
        cout << "throwing exception2: \n";
        v[2];
    }
    catch (out_of_range e) {
        cout << "Exception out of range\n";
        cout << e.what();
    }
    catch (exception& d) {
        cout << "General Exception\n";
        cout << d.what();
    }
    catch (...) {
        cout << "special excpetinon\n";
    }
    cout << "Exception handled!";
}

Первое исключение, которое я могу обработать, и программы продолжают работать, тогда как во втором случае программа останавливается и показывает окно Error.

I запустить программу в режиме отладки с настройками по умолчанию:

Настройки исключений VS

Я бы хотел обработать второе исключение так же, как первое. Спасибо!

1 Ответ

1 голос
/ 10 июля 2020

Ошибка подтверждения отладки! Индекс вектора выражения вне диапазона

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

В C ++ существует политика, не заставляющая программу платить за все, о чем явно не просили. В этом случае проверка, необходимая для создания перехватываемого исключения, замедляет работу программы, поэтому оператор [] не выполняет никаких проверок 1 . Вы получаете более быструю программу, но вы-программист должны пообещать, что программа никогда go не выйдет за пределы.

Метод std::vector::at проверяет и выдаст исключение, но, используя at, вы выбрали более медленную программу.

1 Не требует любых проверок - лучший способ слово это. В этом случае реализация vector в отладочной версии реализации стандартной библиотеки MicroSoft по умолчанию выполняет проверку и выводит сообщение «Debug Assertion Failed!» сообщение - это прямой результат. Сборки отладки оптимизированы для упрощения отладки и имеют тенденцию быть медленными. Эта проверка не выполняется в библиотеке выпуска, потому что сборки выпуска оптимизированы для производительности.

...