我有如下的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块。但是,它永远不会进入那里。我在这里做什么错了?
答案 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;
}
它将捕获任何引发的异常,但是您将无法访问所引发的任何内容,因此只能给出一般性消息。