Joh*_*0te 0 c++ exception-handling
我很擅长C/C++中的异常处理 - 我知道所有关于从std :: exception创建自定义类,何时抛出,什么时候回到UNIX errno之类的简单事情等等.我确实有一件事我'当谈到访问COTS代码时,总是有点模糊.
如果我从COTS库中调用函数,如下所示:
void DoSomething()
{
try
{
CallCotsFunction();
}
catch (CotsException& ce)
{
//Cots error caught
}
catch (...)
{
//Unknown error caught.
}
}
Run Code Online (Sandbox Code Playgroud)
如果CallCotsFunction()异常处理不好或没有异常处理并执行除零或其他什么,它会传播到我的异常处理程序吗?
如果CallCotsFunction()导致sig-11或某种类型的东西会被抓住,或者所有赌注都是严重的?
在Linux上,unix信号通常不会触发异常处理程序.另外,一般来说,从信号处理程序抛出异常是不安全的(至少,你必须编译-fnon-call-exceptions;即使那时我见过混合报告).
另请注意,您应始终通过引用捕获异常,以避免切片:
catch (CotsException &ce)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
简而言之:如果你的第三方库允许C++异常传播而没有被捕获,是的,它会命中你的应用程序.如果它是从std :: exception或其他常见类型派生的,那么你应该能够捕获它.如果它是一些没有暴露给你的内部类型,你将无法通过名称捕获它(但catch (...)应该抓住它).CPU异常(除以零,段错误等)不会自动触发C++异常,除非您或库安装信号处理程序进行转换; 在这种情况下,触发信号的代码必须构建-fnon-call-exceptions用于堆栈展开才能正常工作.
通常,如果库触发SIGFPU或SIGSEGV等错误,则尝试使用异常进行恢复的结果是不可预测的; 库可能不会期望在此时展开其堆栈,并且使用SIGSEGV,您可能会发生堆损坏,导致异常抛出系统本身出错.我不建议尝试以这种方式恢复 - 只是让过程死亡.