try catch块

时间:2015-05-31 17:29:20

标签: c++ exception

我做了一个简单的 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;

}

5 个答案:

答案 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}已中止(核心转储)