Не могу поймать исключение std :: stoi - PullRequest
0 голосов
/ 11 апреля 2020

Всякий раз, когда я вводил что-то кроме целого числа, я надеялся, что блок catch будет выполнен, но вместо этого я получаю эту ошибку:

Необработанное исключение в 0x002D0C39 в A03.exe: Stack cook ie Инструментальный код обнаружил переполнение буфера в стеке. произошло

, что приводит меня к:

Исключение, выданное в 0x76D44192 в A03.exe: исключение Microsoft C ++: std :: invalid_argument в ячейке памяти 0x0116D83 C.

Необработанное исключение в 0x000608B9 в A03.exe: инструментальный код стека ie обнаружил переполнение буфера в стеке.

Я пробовал различные варианты блоков и исключений с помощью та же ошибка. Может кто-нибудь сказать мне, что я делаю не так? Спасибо!

Вот код:

int main() {
    while (true) {
        std::string input;
        int num = 0;

        std::cout << "What number do you want to show?";
        std::cin >> input;
        try 
        {
            num = std::stoi(input);
            if (num >= 0 && num < 10)
            {
                std::cout << "FILLER: This will draw the number";

                exit(0);
            }
            else {
                std::cout << "FILLER: This is the else";
                exit(1);
            }
        }
        catch (std::runtime_error e) 
        {
            std::cout << e.what();
            //std::cout << "That is not a valid number." << '\n';
        }
    }
    return 0;
}

ОБНОВЛЕНИЕ : отредактировал обработчик исключений, но все еще с ошибками:

int main() {
    while (true) {
        std::string input;
        int num = 0;

        std::cout << "What number do you want to show?";
        std::cin >> input;
        try 
        {
            num = std::stoi(input);
            if (num >= 0 && num < 10)
            {
                std::cout << "FILLER: This will draw the number";

                exit(0);
            }
            else {
                std::cout << "FILLER: This is the else";
                exit(1);
            }
        }
        catch (std::invalid_argument &e) 
        {
            std::cout << e.what();
            //std::cout << "That is not a valid number." << '\n';
        }
    }
    return 0;
}

1 Ответ

1 голос
/ 11 апреля 2020

Исключением, которое выдает эта функция, является std::invalid_argument, которое имеет следующие соединения наследования: std::exception <- std::logic_error <-std::invalid_argument. Это означает, что вы можете использовать любой из вышеперечисленных в качестве типа перехвата (а также ...), чтобы перехватить исключение. std::runtime_error не является одним из вариантов (std::exception <- std::runtime_error).

Измените свой catch раздел на:

catch (std::invalid_argument &e) {
    std::cout << e.what();
    //std::cout << "That is not a valid number." << '\n';
}

Читать о:

std :: invalid_argument
std: : runtime_error
std :: exception - Дерево исключений

...