Почему код внутри catch не выполняется - PullRequest
0 голосов
/ 31 октября 2018

У меня есть класс Foo следующим образом

Foo.h

#pragma once
class Foo
{
public:
    Foo() = default;
    ~Foo() = default;

    void DoSomething();
};

Foo.cpp

#include "Foo.h"

void Foo::DoSomething()
{
    throw "something happened";
}

И я использую класс как:

#include <iostream>
#include "Foo.h"

int main()
{
    try
    {
        Foo foo;
        foo.DoSomething();
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}

Я ожидаю, что код войдет в блок catch. Однако, это никогда не идет туда. Что я тут не так делаю?

1 Ответ

0 голосов
/ 31 октября 2018

Когда вы делаете

throw "something happened"

Вы не бросаете std::exception. Вы бросаете строковый литерал, который имеет тип const char[N]. Чтобы поймать его, вам понадобится блок catch типа

catch (const char* e)
{
    std::cout << e << std::endl;
}

В качестве альтернативы вы можете выбросить что-то, полученное из std::exception, например std::runtime_error и которое будет выглядеть как

void Foo::DoSomething()
{
    throw std::runtime_error("something happened");
}

...

catch (const std::exception& e) // catch by reference to const
{
    std::cout << e.what() << std::endl;
}

Вы также можете указать обработчик по умолчанию, например

catch (...)
{
    std::cout << "something bad happened - cannot recover" << std::endl;
}

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

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