opengl catch(...)没有捕获异常,我的程序仍在崩溃

7cwmlq89  于 2023-08-04  发布在  其他
关注(0)|答案(5)|浏览(122)

我有一个问题,我的应用程序在初始化崩溃的测试。我添加了更多的日志记录和异常处理,但它仍然崩溃,并没有触发我的错误处理。
如果我的main()看起来像这样,并且有catch(...),那么在什么情况下它不会被触发呢?

try{
    simed::CArmApp app(0, cmd);
    for(bool done = false;!done;) 
    {
        done = !app.frame();
    }
} catch(const std::runtime_error &e){
    handleApplicationError(e.what());
    return -1;
} catch(...) {
    handleApplicationError("Unknown Error");
    return -999;
}

字符集
我的代码正在调用一个库进行OpenGL渲染,这就是我认为事情出错的地方。

4bbkushb

4bbkushb1#

如果一个C++ catch(...)块没有捕获错误,可能是因为Windows错误。
在Windows上有一个称为Structured Exception Handling的概念,当发生不好的事情时,操作系统会引发“异常”,例如取消引用无效的指针,除以零等。我说“异常”是因为这些不是C异常;相反,这些是Windows以C风格定义的关键错误-这是因为Win32是用C编写的,所以C异常是不可行的。
参见:

如果你想要C++异常处理和SEH,也许你可以尝试以下(未经测试的)代码:

__try
{
    try
    {
        // Your code here...
    }
    catch (std::exception& e)
    {
        // C++ exception handling
    }
}
__except(HandleStructuredException())
{
    // SEH handling 
}

字符集

4bbkushb

4bbkushb2#

如果一个对象的析构函数抛出了一个异常,而该对象是由于堆栈展开以处理另一个异常而被销毁的,那么程序将退出,无论是否为catch(...)

8i9zcol2

8i9zcol23#

到目前为止,我知道至少有两种情况catch(...)实际上不能 * 捕获 *
1.**超过1个未处理的异常:**当一个异常在处理之前被抛出,那么c++将无法处理,应用程序将崩溃。
1.**抛出不在异常规范列表中的异常:**如果任何方法抛出不在异常规范列表中的异常(in any),则调用unexpected,该方法调用abort

ssm49v7z

ssm49v7z4#

是否声明了全局对象?如果在主循环之外创建了任何对象,这可以解释为什么它没有被捕获(它不在try-catch中)。

wydwbb8l

wydwbb8l5#

如果您使用的是多线程,并且抛出了异常,提示线程的析构函数,那么可能会忽略该异常并调用abort。std::jthread(C20)解决了这个问题,但是如果你不能访问C20,那么你需要一个清理函数/lambda来在抛出异常之前终止线程。

相关问题