<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

異常機制的使用

作者: 時(shí)間:2009-12-28 來(lái)源:網(wǎng)絡(luò ) 收藏

根據上述規則,典型的try-catch的結構示例如下:

本文引用地址:http://dyxdggzs.com/article/202581.htm



細心的讀者也許會(huì )發(fā)現,上面例子中是通過(guò)引用來(lái)捕獲類(lèi)的對象。當異常對象類(lèi)型為某個(gè)類(lèi)時(shí),有3種方式傳遞到catch子句里:指針、傳值和引用。也許大家首先想到的是指針,指針的確是效率很高的工具,而且不涉及到對象拷貝。但不要忘了,前面的規則15-0-2中明確指出,拋出的異常對象不應該是指針類(lèi)型。而對于傳值和引用,在MISRA C++中給出的規定是:通過(guò)引用捕獲異常。
規則15-3-5(強制):若異常對象為類(lèi)的對象時(shí),應該通過(guò)引用來(lái)捕獲。
通過(guò)值傳遞,不但會(huì )增加拷貝對象的開(kāi)銷(xiāo),而且還會(huì )出現“退化”問(wèn)題。所謂“退化”是指:如果異常對象是一個(gè)派生類(lèi)對象,但被作為基類(lèi)捕獲,那么只有基類(lèi)的函數(包括虛函數)能被調用,派生類(lèi)中增加的數據成員都不能被訪(fǎng)問(wèn)。通過(guò)引用捕獲則沒(méi)有這個(gè)問(wèn)題。下面的例子具體地說(shuō)明了“退化”問(wèn)題:


鑒于類(lèi)的構造函數和析構函數的特殊性,還有兩點(diǎn)需要注意。
規則15-3-3(強制):如果類(lèi)的構造函數和析構函數是function-try-block結構的,在catch處理程序中不能引用該類(lèi)或其基類(lèi)的非靜態(tài)成員。
這種行為的后果是不定的。比如說(shuō),當構造對象分配內存時(shí)拋出了異常,這時(shí)該對象本身還不存在,訪(fǎng)問(wèn)其成員也就出錯。相反,在析構函數里,可能在異常處理程序執行前該對象已被成功銷(xiāo)毀了,也就無(wú)從訪(fǎng)問(wèn)其成員了。而類(lèi)的靜態(tài)成員則沒(méi)有上述問(wèn)題。
規則15-5-1(強制)。類(lèi)的析構函數退出后不能還有未處理的異常。
當異常拋出時(shí),會(huì )進(jìn)行棧展開(kāi)。如果在某個(gè)析構過(guò)程中引發(fā)沒(méi)有被處理的異常,程序將會(huì )以不定的方式終止。析構函數拋出異常的問(wèn)題在很多C++的書(shū)中都有討論,概括來(lái)說(shuō):析構函數應盡可能地避免拋出異常,如果的確無(wú)法避免,則析構函數自己應該包含處理所有可能拋出的異常的代碼。

4 小 結
異常是C++嶄新而高級的特性之一。與其他C++特性一樣,C++標準并沒(méi)有規定應該如何來(lái)實(shí)現異常,這依賴(lài)于具體的編譯器。異常是有代價(jià)的,它會(huì )增加代碼大小和運行開(kāi)銷(xiāo)。以VC++為例,異常處理是通過(guò)在函數調用棧里增加許多相關(guān)的數據結構來(lái)實(shí)現的,感興趣的讀者可以查看相關(guān)資料,這里不再進(jìn)一步討論;而且異常處理是在操作系統的協(xié)助下,由C++編譯器和運行時(shí)異常處理庫共同完成的。如何合理地使用異常機制來(lái)提高程序的健壯性,MISRA C++給出了一些規范,但具體還需要程序員反復斟酌,甚至需要多次實(shí)驗。至此,關(guān)于MISRA-C++:2008的學(xué)習暫告一段落。
在這4期的講座中,我們主要討論了C++對于C新增的特性,列舉和解釋了其中有代表性的規則,且盡量使每篇文章都能涵蓋C++的一個(gè)重要特性。有些例子是在我們理解的基礎上加的,可能存在著(zhù)錯誤或偏差,歡迎大家和我們共同討論。通過(guò)這4期介紹,希望大家能夠意識到:C++對于C并不是簡(jiǎn)單的語(yǔ)言的改進(jìn),C++面向對象的思想從根本上影響了軟件的架構。
可以預見(jiàn),隨著(zhù)嵌入式產(chǎn)業(yè)的飛速發(fā)展,在嵌入式領(lǐng)域C++將會(huì )有輝煌的前景。對C++進(jìn)行改造,使其適用于嵌入式環(huán)境,提高其可靠性,對于推動(dòng)C++在嵌入式領(lǐng)域的應用是很重要的。MISRA-C已經(jīng)在嵌入式C語(yǔ)言上取得了很大的成功,成為行業(yè)普遍認同和遵循的規范。我們希望MISRA-C++也能和MISRA-C一樣,推動(dòng)C++在嵌入式領(lǐng)域的規范化。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 機制

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>