2015-10-16 62 views
3

有没有办法导致异常无法在特定的堆栈帧之上传播,同时又不会丢失堆栈信息?C++禁用堆栈帧下面的异常

IE,

int foo() { 
    throw 3; 
} 

int bar() { 
    // do something here 
    foo(); 
} 

int main() { 
    try { 
     bar(); 
    } catch(...) { 
     std::cout << "Caught"; 
    } 
} 

我想这是在“扔3”呼叫终止,而不能由主被抓。

这是可能的吗?

+2

异常机制将继续搜索更高范围的异常处理程序(catch)。我不知道如何在没有将异常处理程序放在希望停止的地方的情况下停止该方法。 – NathanOliver

回答

4

后发挥作用的声明和定义,只需添加throw()

#include <iostream> 

void* g_pStackTrace = NULL; 

int foo() throw(); 

int foo() throw() { 
    g_pStackTrace = <stack_trace_function_call>; 
    throw 3; 
} 

int bar() { 
    // do something here 
    foo(); 
    return 0; 
} 

int main() { 
     bar(); 

     if (g_pStackTrace != NULL) 
     { 
      // Work with our stack 
     } 
} 

这将阻止你扔的要求在不同的操作系统

堆栈跟踪功能

backtrace_symbols(3) - 在Linux,Mac OSX

CaptureStackBackTrace(...) - windows

Live demo

+0

您还可以使用'set_unexpected()'函数提供您自己的未指定函数实现。 – Mykola

+0

@Mykola我道歉,我不明白OP在找什么。你的解决方案是正确的,当你从'foo()'中抛出时,它会终止应用程序,这正是他想要的。 – Praetorian

+0

@Praetorian:程序工作正常,没有任何意外 – Mykola