2015-10-16 26 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