我們首先討論通過指針方式捕捉異常(catch by pointer)。從throw處傳遞一個(gè)異常到catch子句是一個(gè)緩慢的過程,在理論上這種方法的實(shí)現(xiàn)對(duì)于這個(gè)過程來說是效率最高的。因?yàn)樵趥鬟f異常信息時(shí),只有采用通過指針拋出異常的方法才能夠做到不拷貝對(duì)象,例如:
通過值捕捉異常(catch-by-value)可以解決上述的問題,例如異常對(duì)象刪除的問題和使用標(biāo)準(zhǔn)異常類型的問題。但是當(dāng)它們被拋出時(shí)系統(tǒng)將對(duì)異常對(duì)象拷貝兩次(參見條款12)。而且它會(huì)產(chǎn)生slicing PRoblem,即派生類的異常對(duì)象被做為基類異常對(duì)象捕捉時(shí),那它的派生類行為就被切掉了(sliced off)。這樣的sliced對(duì)象實(shí)際上是一個(gè)基類對(duì)象:它們沒有派生類的數(shù)據(jù)成員,而且當(dāng)調(diào)用它們的虛擬函數(shù)時(shí),系統(tǒng)解析后調(diào)用的是基類對(duì)象的函數(shù)。(當(dāng)一個(gè)對(duì)象通過傳值方式傳遞給函數(shù),也會(huì)發(fā)生一樣的情況――參見Effective C++ 條款22)。例如下面這個(gè)程序采用了擴(kuò)展自標(biāo)準(zhǔn)異常類的異常類層次體系:
假如你通過引用捕捉異常(catch by reference),你就能避開上述所有問題,不會(huì)為是否刪除異常對(duì)象而煩惱;能夠避開slicing異常對(duì)象;能夠捕捉標(biāo)準(zhǔn)異常類型;減少異常對(duì)象需要被拷貝的數(shù)目。所以你還在等什么?通過引用捕捉異常吧(Catch exceptions by reference)!