gpt4 book ai didi

C++ 异常处理失败

转载 作者:太空宇宙 更新时间:2023-11-04 15:51:40 27 4
gpt4 key购买 nike

我非常擅长 C/C++ 中的异常处理 - 我知道所有关于从 std::exception 创建自定义类、何时抛出、何时回退到更简单的东西,如 UNIX errno 等。我有一个不过,在访问 COTS 代码时,我总是有点云里雾里。

如果我像这样从 COTS 库中调用一个函数:

void DoSomething()
{
try
{
CallCotsFunction();
}
catch (CotsException& ce)
{
//Cots error caught
}
catch (...)
{
//Unknown error caught.
}
}

如果 CallCotsFunction() 异常处理不佳或没有异常处理并执行除零或其他操作,它会传播到我的异常处理程序吗?

如果 CallCotsFunction() 导致 sig-11 或类似的东西,它会被捕获吗,还是所有的赌注都会被如此严重的事情所影响?

最佳答案

在 Linux 上,unix 信号通常不会触发异常处理程序。此外,一般来说,从信号处理程序中抛出异常是不安全的(至少,您必须使用 -fnon-call-exceptions 进行编译;即便如此,我也看到过混合的报告)。

另请注意,您应该始终通过引用捕获异常,以避免切片:

catch (CotsException &ce)
{
// ...
}

简而言之:如果您的第三方库允许 C++ 异常向上传播而不被捕获,是的,它会影响您的应用程序。如果它派生自 std::exception 或其他一些常见类型,您应该能够捕获它。如果它是某种未向您公开的内部类型,您将无法通过名称捕获它(但 catch (...) 应该捕获它)。 CPU 异常(被零除、段错误等)不会自动触发 C++ 异常,除非您或库安装信号处理程序来转换它;在这种情况下,触发信号的代码必须使用 -fnon-call-exceptions 构建,以便堆栈展开正常工作。

一般来说,如果库触发了SIGFPU或者SIGSEGV这样的错误,尝试异常恢复的结果是不可预知的;该库可能不希望在此时展开其堆栈,并且使用 SIGSEGV,您可能会遇到堆损坏,从而导致异常抛出系统本身出现故障。我不建议尝试以这种方式恢复 - 让进程停止。

关于C++ 异常处理失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7233901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com