我做了一个简单的 throw" TEST THROW" 并且它没有被我的 catch(std :: exception& e)捕获。是因为我正在捕捉 std :: exception& ë?我的意思是,只有从std :: exception派生的异常类才被捕获?如果没有,我做错了什么还是正常的?顺便说一句,两个catch块都没有捕获抛出异常。
int main()
{
try
{
throw "TEST THROW"; // TEST
Core core;
core.Init();
core.Load();
while (!core.requestCloseWindow)
{
core.HandleInput();
core.Update();
core.Draw();
}
core.Unload();
core.window->close();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
try
{
time_t rawTime;
struct tm* timeInfo;
char timeBuffer [80];
time(&rawTime);
timeInfo = localtime(&rawTime);
strftime(timeBuffer, 80, "%F %T", timeInfo);
puts(timeBuffer);
std::ofstream ofs; // Pas besoin de close, car le destructeur le fait.
ofs.exceptions(std::ofstream::failbit | std::ofstream::badbit);
ofs.open("log.txt", std::ofstream::out | std::ofstream::app);
ofs << e.what() << std::endl;
}
catch (std::exception& e)
{
std::cerr << "An error occured while writing to a log file!" << std::endl;
}
}
return 0;
}
答案 0 :(得分:6)
您正在投掷const char*
。 std::exception
仅捕获std::exception
及其所有派生类。所以为了抓住你的投掷,你应该抛出std::runtime_error("TEST THROW")
。或std::logic_error("TEST THROW")
;无论什么更合适。 std::exception
的派生类是listed here。
答案 1 :(得分:5)
人们可能遇到这个问题的另一个原因,特别是如果他们最近一直在编写Java,他们可能会抛出指向异常的指针。
/* WARNING WARNING THIS CODE IS WRONG DO NOT COPY */
try {
throw new std::runtime_error("catch me");
} catch (std::runtime_error &err) {
std::cerr << "exception caught and ignored: " << err.what() << std::end;
}
/* WARNING WARNING THIS CODE IS WRONG DO NOT COPY */
将不抓住您投掷的std::runtime_error*
。对于未捕获的异常,它可能会因调用std::terminate
而死亡。
不要使用new
分配异常,只需按值引用构造函数,例如
try {
/* note: no 'new' here */
throw std::runtime_error("catch me");
} catch (std::runtime_error &err) {
std::cerr << "exception caught and ignored: " << err.what() << std::end;
}
答案 2 :(得分:1)
当你抛出一个inherted类型的异常但是inhertence是私有的时候也可能发生这种情况
答案 3 :(得分:0)
你可以添加一个 赶上(...) 阻止它。
答案 4 :(得分:0)
由于这不是 MCVE (什么是Core
?),我无法明确解决问题,但你肯定错过了
#include <exception>
实际上,即使没有包含,GCC也会编译,但是异常不会被捕获,你最终会被
在抛出'std :: exception'
的实例后终止调用what():std :: exception
./ {program}:{PID}已中止(核心转储)