为什么catch中的代码不会被执行

问题描述 投票:1回答:1

我有一个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块。但是,它永远不会进入那里。我在这做错了什么?

c++ exception
1个回答
10
投票

当你这样做

throw "something happened"

你不是扔std::exception。你正在抛出一个字符串文字,其类型为const char[N]。为了捕获它,你需要一个类似的捕获块

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

它将捕获任何抛出的异常但你无法访问抛出的任何东西,所以你只能给出一般信息。

© www.soinside.com 2019 - 2024. All rights reserved.