我想知道如果被调用函数没有throw子句,是否可以从被调用函数中捕获异常。我问这个问题的原因是因为每次我的应用程序崩溃时,catch块内的输出语句都不会被打印
void thread11()
{
while(true)
{
try
{
...
fun2() //static library function
...
}
catch(std::exception& e)
{
std::cout << "exception is " << e.what() << std::endl;
}
}
}
在这里,由于fun2()
,我的应用程序崩溃了。是否可以通过调用函数捕获这些异常?
答案 0 :(得分:1)
您可以使用类似
的内容捕获所有C ++异常try { fun2(); }
catch (...) { std::cout << "an unknown exception was caught\n"; }
函数的 throw
子句仅限制可以从函数中转义的异常集:如果没有throw
子句,则所有异常都可以转义。如果有throw
子句并且抛出了不同的异常,则程序为std::terminate()
。
当捕获所有异常时,没有指示导致异常的原因。唯一有意义的操作是完全吞下错误或重新抛出异常(使用throw;
)以使其在别处处理。
问题中对问题的描述意味着实际上没有异常(C函数不能抛出异常),但您更倾向于遇到一个信号:与其他操作系统(特别是Windows)不同,Linux不会将信号转换为例外。如果要处理信号,则需要设置信号处理程序。但是,从信号处理程序返回后,执行通常只会继续执行程序所在的位置,很可能继续崩溃。为了防止信号处理程序崩溃,您需要解决信号处理程序中遇到的任何问题。例如,在遇到分段错误时,可以将存储器映射到访问的位置。在实践中很少进行,在某些情况下实际上是不可能的。此外,由于最好解决的编程错误,大多数信号都会升高。