<code>#include <iostream> </code>
<code>class</code> <code>A{</code>
<code> </code><code>public</code><code>:</code>
<code> </code><code>A(</code><code>void</code><code>){</code>
<code> </code><code>std::cout << </code><code>"A::A()"</code> <code><< std::endl;</code>
<code> </code><code>}</code>
<code> </code><code>~A(</code><code>void</code><code>){</code>
<code> </code><code>std::cout << </code><code>"A::~A()"</code> <code><<std::endl;</code>
<code>};</code>
<code>class</code> <code>B:</code><code>public</code> <code>A{</code>
<code> </code><code>B(</code><code>void</code><code>){</code>
<code> </code><code>std::cout << </code><code>"B::B(void)"</code><code><<std::endl;</code>
<code> </code><code>~B(</code><code>void</code><code>){</code>
<code> </code><code>std::cout << </code><code>"B::~B(void)"</code> <code><< std::endl;</code>
<code>void</code> <code>func(</code><code>void</code><code>){</code>
<code> </code><code>throw</code> <code>A(); </code><code>//這裡抛出一個匿名A類對象.</code>
<code> </code><code>//這裡調用A的構造函數,直接跳轉到},跳轉到"}",但是不執行匿名的析構函數</code>
<code> </code><code>std::cout << </code><code>"func()"</code> <code><< std::endl; </code><code>//這裡不執行</code>
<code>}</code>
<code>int</code> <code>main(</code><code>void</code><code>){</code>
<code> </code><code>try</code> <code>{ </code><code>//這裡try 和catch都是一個局部作用域,和函數一樣</code>
<code> </code><code>func();</code><code>//直接跳轉到'}',但是從func函數裡,抛出的異常對象的析構函數</code>
<code> </code><code>//還是不調用 </code>
<code> </code><code>std::cout << </code><code>"try"</code> <code><< std::endl; </code><code>//不執行</code>
<code> </code><code>}</code>
<code> </code><code>catch</code><code>(A& ex){ </code><code>//這裡對異常抛出的異常對象進行捕捉,如果捕捉不到,則 </code>
<code> </code><code>//直接跳轉到下一個catch語句...,</code>
<code> </code><code>std::cout << </code><code>"catch A"</code><code><<std::endl;</code>
<code> </code><code>return</code> <code>-1;</code>
<code> </code><code>}</code><code>//這裡執行匿名對象的析構函數</code>
<code> </code><code>std::cout << </code><code>"main endl..."</code> <code><<std::endl;</code>
<code> </code><code>return</code> <code>0;</code>
catch子句會根據異常的類型自上而下順序比對,而不是最優比對
catch子句中使用引用接受異常對象,避免拷貝構造的性能開銷,同時可以減少淺拷貝的風險
<code>#include <iostream></code>
<code>class</code> <code>A{ </code>
<code> </code><code>A(){</code>
<code> </code><code>~A(){</code>
<code> </code><code>std::cout << </code><code>"A::~A()"</code> <code><< std::endl;</code>
<code>class</code> <code>B{</code>
<code> </code><code>B(){</code>
<code> </code><code>std::cout << </code><code>"B::B()"</code> <code><< std::endl;</code>
<code> </code><code>~B(){</code>
<code> </code><code>std::cout << </code><code>"B::~B()"</code> <code><< std::endl;</code>
<code>class</code> <code>C{</code>
<code> </code><code>C(){</code>
<code> </code><code>std::cout << </code><code>"C::C()"</code> <code><< std::endl;</code>
<code> </code><code>~C(){</code>
<code> </code><code>std::cout << </code><code>"C::~C()"</code> <code><< std::endl;</code>
<code> </code><code>throw</code> <code>C();</code><code>//調用C的構造函數,直接跳轉到'}'</code>
<code> </code><code>try</code><code>{</code>
<code> </code><code>func();</code><code>//直接跳轉到'}'</code>
<code> </code><code>catch</code><code>(</code><code>int</code><code>& ex){</code><code>//這裡發現int& ex = 匿名對象,不成立,則直接倒轉到轉到'}'</code>
<code> </code><code>std::cout << </code><code>"catch:int"</code> <code><< std::endl;</code><code>//不執行</code>
<code> </code><code>catch</code><code>(B& ex){</code><code>//B& ex =匿名對象,不成立,直接跳轉到'}'</code>
<code> </code><code>std::cout << </code><code>"catch:B"</code> <code><< std::endl;</code><code>//不執行 </code>
<code> </code><code>}</code>
<code> </code><code>catch</code><code>(C& ex){</code><code>//C& ex = 匿名對象,成立,則執行catch體内的語句</code>
<code> </code><code>std::cout << </code><code>"catch:C"</code> <code><< std::endl;</code><code>//執行</code>
<code> </code><code>}</code><code>//這裡調用匿名對象的析構函數</code>
本文轉自神ge 51CTO部落格,原文連結:http://blog.51cto.com/12218412/1869196