C++的異常對象如何被傳遞

來源:互聯網
上載者:User

轉自http://se.csai.cn/category.asp?class=experteyes&page=3

在相遇篇的第4集文章中,曾經講到過在C++的異常處理模型中,是用“對象”來描述程式中出現的異常,並且在那篇文章中詳細討論了這樣做所帶來的諸多好處,其中之一呢就是:對象一般都很好地實現了對象的構造、對象的銷毀、對象的轉存複製,這為異常處理模型中異常對象的轉存複製和對象銷毀提供了很好的支援。是的沒錯,但是所謂的異常對象到底是如何被複製和傳遞呢?從本篇文章開始,和接下來的幾篇文章中,主人公阿愚將和大家一同比較深入地探討這個問題,并力求弄清每一個重要的細節。

  概述

  呵呵!sorry,居然忘了闡述一下定義。那就是“C++的異常對象被傳遞”指的是什麼?想當然大家也都知道,這指的就是異常出現時throw出的異常對象如何被傳遞到catch block塊中,catch block中的異常處理模組再根據異常對象提供的異常資訊做出相應的處理。程式員朋友們也許認為這很簡單,其實說簡單也好像不太簡單,因為這種對象的傳遞或複製可能發生在同一個函數的不同程式塊範圍間,也有可能是從當前的函數傳遞到上一個函數中,更有可能是把異常對象傳遞複製到上上(甚至更多層)的函數中。

  異常對象的傳遞有點類似於函數調用過程中的參數傳遞的過程。瞧!catch關鍵字的文法不就跟函數的定義有點類似嗎?作為入參的異常對象也是用括弧被括起來的,只不過catch只能是擁有一個參數。另外連catch(…)文法也是抄襲函數定義的方式,表示接受任意類型的資料對象。

  C++程式中函數的調用是通過“棧”來實現的,其中參數的傳遞也是儲存到棧中,以實現兩個函數間的資料共用。那麼異常對象的傳遞呢?當然也是通過棧,其實這是很明顯的一件事情,因為異常對象本身肯定是局部變數,因此它也肯定是被儲存在棧中的。不過異常對象的傳遞畢竟還是與函數參數的傳遞有很大的不同,函數參數的傳遞是嚴謹的、一級一級的對象資料的壓棧過程和出棧過程;但異常對象的傳遞卻遠比這要複雜些,因為它這是逆序的,屬於局部變數的異常對象可能要往上層(或更上層)函數傳遞,它的過程是一個跳躍式的或比較混亂的過程。關於異常對象的傳遞具體是如何?的,在愛的秘密篇中分析C++異常處理模型的實現時會再做詳細闡述。而目前需要搞清楚的是,這個過程中所需要遵從的一些規律或標準。

  函數的參數的傳遞一般有指標、傳值和引用三種方式,同樣,異常對象的傳遞也同樣有這三種方式的區別。現在開始,主人公阿愚分別講述每一種方式下異常對象是如何被傳遞的,不過在正式開始之前,還是先簡要總結函數調用的過程,以及這過程棧的變化。因為這對隨後的具體分析和理解也許大有協助。

  函數的調用過程與“棧”

  C++程式員對這個過程肯定非常熟悉,因此這裡不做細緻的講述,只做一個概要性的總結。

  (1) 函數的調用過程實質上利用棧來實現的指令(eip)執行遠程轉移和返回的過程;它在CPU指令層級上就得到了支援(CALL和RET指令);

  (2) 每個線程都有一個自己的棧,因此每個線程的函數調用執行是相互不受影響的;

  (3) C和C++中的函數參數的入棧順序一般是從右至左進行;

  (4) C++中的函數的參數的傳遞一般有指標、傳值和引用三種方式;

  (5) C和C++中函數的傳回值一般都是儲存到EAX寄存器中返回的;

  (6) C和C++中函數中定址參數和局部變數,一般都是通過EBP寄存器加上位移來進行的,如參數一般是:[EBP+XX],而局部變數則一般是:[EBP-XX];

  (7) 在程式運行時,EBP中的值一般是指向當前的函數調用幀,而ESP一般指向棧頂。

  如果對上面論述有不太清楚或不太熟悉的朋友,建議先看看專門講述C++設計和編程方面的書籍。下面給出一個線程運行期間,它棧中所儲存的資料的布局(部分區段),如:

  

 

  總結

  (1) 與函數的參數的傳遞類似, C++的異常對象的傳遞也分指標、傳值和引用三種方式;

  (2) 與函數的參數的傳遞不同的是,異常對象的傳遞是向上逆序的,而且是跳躍式的。

  下一篇文章詳細介紹C++的異常對象按傳值的方式被複製和傳遞。朋友們,不要錯過,請繼續吧!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.