如何从被调用的函数中捕获异常

时间:2017-12-13 15:08:56

标签: c++

我想知道如果被调用函数没有throw子句,是否可以从被调用函数中捕获异常。我问这个问题的原因是因为每次我的应用程序崩溃时,catch块内的输出语句都不会被打印

void thread11()
{
     while(true)
     {
          try
          {
              ...
              fun2() //static library function
              ...
          }
          catch(std::exception& e)
          {
              std::cout << "exception is " << e.what() << std::endl;
          }
      }
}

在这里,由于fun2(),我的应用程序崩溃了。是否可以通过调用函数捕获这些异常?

1 个答案:

答案 0 :(得分:1)

您可以使用类似

的内容捕获所有C ++异常
try { fun2(); }
catch (...) { std::cout << "an unknown exception was caught\n"; }
函数的

throw子句仅限制可以从函数中转义的异常集:如果没有throw子句,则所有异常都可以转义。如果有throw子句并且抛出了不同的异常,则程序为std::terminate()

当捕获所有异常时,没有指示导致异常的原因。唯一有意义的操作是完全吞下错误或重新抛出异常(使用throw;)以使其在别处处理。

问题中对问题的描述意味着实际上没有异常(C函数不能抛出异常),但您更倾向于遇到一个信号:与其他操作系统(特别是Windows)不同,Linux不会将信号转换为例外。如果要处理信号,则需要设置信号处理程序。但是,从信号处理程序返回后,执行通常只会继续执行程序所在的位置,很可能继续崩溃。为了防止信号处理程序崩溃,您需要解决信号处理程序中遇到的任何问题。例如,在遇到分段错误时,可以将存储器映射到访问的位置。在实践中很少进行,在某些情况下实际上是不可能的。此外,由于最好解决的编程错误,大多数信号都会升高。