【问题标题】:Why can't I catch this exception? (C++, SFML)为什么我不能捕捉到这个异常? (C++,SFML)
【发布时间】:2020-08-26 18:10:49
【问题描述】:

也许这是一个愚蠢的问题,但我不明白为什么我可以在前一段代码中捕获异常,而在后者中却不能。

第一段代码:

int main() {
    try {
        throw std::logic_error("Error");
        sf::RenderWindow window(sf::VideoMode(800, 600), "Test", sf::Style::Default);
        while (window.isOpen()) {
            sf::Event event;
            while (window.pollEvent(event)) {
                if (event.type == sf::Event::Closed)
                    window.close();
            }
            
            window.clear(sf::Color::Black);
            window.display();
        }
    }
    catch(std::logic_error& l){
        std::cerr<<l.what()<<std::endl;
        exit(42);
    }
    return 0;
}

第二段代码:

int main() {
    try {
       
        sf::RenderWindow window(sf::VideoMode(800, 600), "Test", sf::Style::Default);
        throw std::logic_error("Error");
        while (window.isOpen()) {
            sf::Event event;
            while (window.pollEvent(event)) {
                if (event.type == sf::Event::Closed)
                    window.close();
            }

            window.clear(sf::Color::Black);
            window.display();
        }
    }
    catch(std::logic_error& l){
        std::cerr<<l.what()<<std::endl;
        exit(42);
    }
    return 0;
}

【问题讨论】:

  • 仅供参考,通常最好通过const 引用而不是非常量来捕获异常,例如:catch(const std::logic_error&amp; l)

标签: c++ exception sfml uncaught-exception


【解决方案1】:

最后我发现问题在于我如何链接 SFML 库。 我只需要从 CMake 文件中的 target_link_libraries(SFML_Test sfml-system sfml-window sfml-graphics -static) 中删除 -static。 感谢所有试图帮助我的人。

【讨论】:

    【解决方案2】:

    可能是因为sf::RenderWindow 之前抛出了另一种类型的异常。

    尝试捕捉std::exception,而不是std::logic_error(它继承自std::exception

    更新

    您的应用可能在sf::RenderWindow 初始化期间崩溃。这种情况下不会产生异常,但可以尝试捕捉信号。

    #include <signal.h>
    
    void fall()
    {
          int* p = 0x00000000; 
          *p = 13;
    }
    
    void posix_death_signal(int signum)
    {
        signal(signum, SIG_DFL);
        exit(3);
    }
    
    int main(int argc, char *argv[])
    {
        signal(SIGSEGV, posix_death_signal);
        fall();
        return 0;
    }
    

    或者std::abort可能是从sf::RenderWindow调用的,所以你可以尝试处理一下:https://en.cppreference.com/w/cpp/utility/program/abort

    std::unexpected。你也可以尝试处理

    std::exit...

    实际上我想建议附加调试器并看看会发生什么,看看在返回之前运行你的应用程序有多远

    更新 2

    有时根本问题是缺少导致应用无法启动的 DLL。

    【讨论】:

    • std::logic_error 确实继承自 std::exception 但如果没有其他异常,您仍然会错过它
    • 我什至尝试写catch(...),但我没有看到任何变化。
    • @NiccolòNiccoli 我添加了更多信息
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多