C++ C++;异常处理失败

C++ C++;异常处理失败,c++,exception-handling,C++,Exception Handling,我对C/C++中的异常处理非常在行——我知道如何从std::exception创建自定义类,何时抛出,何时求助于更简单的东西,如UNIX错误,等等。但在访问COTS代码时,有一件事我总是有点迷茫 如果我从COTS库调用函数,如下所示: void DoSomething() { try { CallCotsFunction(); } catch (CotsException& ce) { //Cots error ca

我对C/C++中的异常处理非常在行——我知道如何从std::exception创建自定义类,何时抛出,何时求助于更简单的东西,如UNIX错误,等等。但在访问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时,可能会出现堆损坏,从而导致异常引发系统本身出错。我不建议尝试以这种方式进行恢复—让进程死掉。

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

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

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


通常,如果库触发了SIGFPU或SIGSEGV等故障,则尝试恢复异常的结果是不可预测的;库可能不希望在该点上展开堆栈,而使用SIGSEGV时,可能会出现堆损坏,从而导致异常引发系统本身出错。我不建议用这种方式恢复,只是让进程死亡。

信号独立于,和预,C++异常。< /P>

一个零除可以被你的库捕获,在这种情况下,库可以抛出一个真正的C++异常,或者它会被你的CPU捕获,导致一个信号终止你的进程。


<>我不建议从信号处理器内部抛出C++异常。

< P>信号独立于,和预,C++异常。

一个零除可以被你的库捕获,在这种情况下,库可以抛出一个真正的C++异常,或者它会被你的CPU捕获,导致一个信号终止你的进程。


我不建议从信号处理程序内部抛出C++异常。

< P>没有被函数捕获的任何异常都会传播到调用方。调用方是否应该费心捕捉这样的异常是另一回事,取决于。例如,如果函数被零除,然后出现异常,那么其他所有内容都处于什么状态?如果您不知道,那么允许程序继续运行真的明智吗


我会以同样的方式处理信号。如果没有人告诉您期望第三方库触发信号,那么您不应该尝试处理它们。

函数未捕获的任何异常都将传播到调用方。调用方是否应该费心捕捉这样的异常是另一回事,取决于。例如,如果函数被零除,然后出现异常,那么其他所有内容都处于什么状态?如果您不知道,那么允许程序继续运行真的明智吗


我会以同样的方式处理信号。如果您没有被告知希望第三方库触发信号,那么您不应该尝试处理这些信号。

谢谢,忘记参考-编辑问题以匹配它:)谢谢,忘记参考-编辑问题以匹配它:)