2015-12-14 61 views
0
#include <string> 
#include <iostream> 
using namespace std; 

class Error { 
    string msg; 
public: 
    Error(string s) : msg(s) {} string get_msg() 
    { 
     return msg; 
    } 
}; 

void goodbye() { 
    cout << "goodbye!\n"; 
    throw Error("goodbye error"); 
    cout << "goodbye() returns\n"; 
} 

void hello() 
{ 
    cout << "hello world!\n"; 
    try 
    { 
     goodbye(); 
    } 
    catch (Error e) 
    { 
     throw Error("hello error"); 
    } 
    cout << "hello() returns\n"; 
} 

int main() { 
    try { 
    hello(); 
    cout << "done\n"; 
    } 
    catch (Error e) 
    { 
     cout << e.get_msg() << endl; 
    } 
    catch (...) 
    { 
     cout << "Unknown error" 
     << endl; 
    } 
    cout << "main() returns\n"; 
    return 0; 
} 

這是輸出:爲什麼這是這個異常堆棧的輸出?

hello world! 
goodbye! 
hello error 
main() returns 

我知道主進入Hello功能,但我不明白的是在其中得到執行堆棧的順序,爲什麼拋出錯誤「hello error」行正在執行。

+0

然後逐行通過代碼行與調試器。 – LogicStuff

+0

如果你不明白,那就意味着你正在處理太多的陳述。我建議你一次添加一個東西,然後看看事情是如何執行的,以及按照什麼順序。追加幾個'cout'來跟蹤路徑(特別是在'Error'的構造函數中)。 – Nawaz

回答

0
  • 功能hello執行
  • "hello world!"輸出
  • 功能goodbye執行
  • "goodbye!"輸出
  • Error("goodbye error");拋出
  • 如存在於goodbye沒有異常處理程序,它退出
  • Error("goodbye error");被釣到在hello
  • Error("hello error");拋出
  • 如存在於hello沒有進一步的異常處理程序,它退出
  • Error("hello error");在主
  • 錯誤消息(hello error)被輸出
  • 的主要是其餘釣到執行
  • "main() returns"輸出