天天看點

c++異常2

<code>#include &lt;iostream&gt;                                                             </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 &lt;&lt; </code><code>"A::A()"</code> <code>&lt;&lt; std::endl;</code>

<code>        </code><code>}</code>

<code>        </code><code>~A(</code><code>void</code><code>){</code>

<code>            </code><code>std::cout &lt;&lt; </code><code>"A::~A()"</code> <code>&lt;&lt;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 &lt;&lt; </code><code>"B::B(void)"</code><code>&lt;&lt;std::endl;</code>

<code>        </code><code>~B(</code><code>void</code><code>){</code>

<code>            </code><code>std::cout &lt;&lt; </code><code>"B::~B(void)"</code> <code>&lt;&lt; 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 &lt;&lt; </code><code>"func()"</code> <code>&lt;&lt; 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 &lt;&lt; </code><code>"try"</code> <code>&lt;&lt; std::endl; </code><code>//不執行</code>

<code>    </code><code>}</code>

<code>    </code><code>catch</code><code>(A&amp; ex){ </code><code>//這裡對異常抛出的異常對象進行捕捉,如果捕捉不到,則    </code>

<code>                    </code><code>//直接跳轉到下一個catch語句...,</code>

<code>        </code><code>std::cout &lt;&lt; </code><code>"catch A"</code><code>&lt;&lt;std::endl;</code>

<code>        </code><code>return</code> <code>-1;</code>

<code>    </code><code>}</code><code>//這裡執行匿名對象的析構函數</code>

<code>    </code><code>std::cout &lt;&lt; </code><code>"main endl..."</code> <code>&lt;&lt;std::endl;</code>

<code>    </code><code>return</code> <code>0;</code>

catch子句會根據異常的類型自上而下順序比對,而不是最優比對

catch子句中使用引用接受異常對象,避免拷貝構造的性能開銷,同時可以減少淺拷貝的風險

<code>#include &lt;iostream&gt;</code>

<code>class</code> <code>A{                                                                        </code>

<code>        </code><code>A(){</code>

<code>        </code><code>~A(){</code>

<code>            </code><code>std::cout &lt;&lt; </code><code>"A::~A()"</code> <code>&lt;&lt; std::endl;</code>

<code>class</code> <code>B{</code>

<code>        </code><code>B(){</code>

<code>            </code><code>std::cout &lt;&lt; </code><code>"B::B()"</code> <code>&lt;&lt; std::endl;</code>

<code>        </code><code>~B(){</code>

<code>            </code><code>std::cout &lt;&lt; </code><code>"B::~B()"</code> <code>&lt;&lt; std::endl;</code>

<code>class</code> <code>C{</code>

<code>        </code><code>C(){</code>

<code>            </code><code>std::cout &lt;&lt; </code><code>"C::C()"</code> <code>&lt;&lt; std::endl;</code>

<code>        </code><code>~C(){</code>

<code>            </code><code>std::cout &lt;&lt; </code><code>"C::~C()"</code> <code>&lt;&lt; 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>&amp; ex){</code><code>//這裡發現int&amp; ex = 匿名對象,不成立,則直接倒轉到轉到'}'</code>

<code>        </code><code>std::cout &lt;&lt; </code><code>"catch:int"</code> <code>&lt;&lt; std::endl;</code><code>//不執行</code>

<code>    </code><code>catch</code><code>(B&amp; ex){</code><code>//B&amp; ex =匿名對象,不成立,直接跳轉到'}'</code>

<code>        </code><code>std::cout &lt;&lt; </code><code>"catch:B"</code> <code>&lt;&lt; std::endl;</code><code>//不執行   </code>

<code>           </code><code>}</code>

<code>    </code><code>catch</code><code>(C&amp; ex){</code><code>//C&amp; ex = 匿名對象,成立,則執行catch體内的語句</code>

<code>        </code><code>std::cout &lt;&lt; </code><code>"catch:C"</code> <code>&lt;&lt; std::endl;</code><code>//執行</code>

<code>    </code><code>}</code><code>//這裡調用匿名對象的析構函數</code>

本文轉自神ge 51CTO部落格,原文連結:http://blog.51cto.com/12218412/1869196

繼續閱讀