为什么catch内的代码无法执行

时间:2018-10-31 19:31:33

标签: c++ exception

我有如下的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 :(得分:10)

完成时

throw "something happened"

您不会抛出std::exception。您将抛出类型为const char[N]的字符串文字。要捕获它,您将需要一个类似

的捕获块
catch (const char* e)
{
    std::cout << e << std::endl;
}

或者,您可以抛出std::runtime_error之类的从std::exception派生的东西,看起来像

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;
}

它将捕获任何引发的异常,但是您将无法访问所引发的任何内容,因此只能给出一般性消息。