国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 服務(wù)器 > Web服務(wù)器 > 正文

More Effective C++:通過(guò)引用捕獲異常

2024-09-01 13:42:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
當(dāng)你寫一個(gè)catch子句時(shí),必須確定讓異常通過(guò)何種方式傳遞到catch子句里。你可以有三個(gè)選擇:與你給函數(shù)傳遞參數(shù)一樣,通過(guò)指針(by pointer),通過(guò)傳值(by value)或通過(guò)引用(by reference)。

  我們首先討論通過(guò)指針?lè)绞讲东@異常(catch by pointer)。從throw處傳遞一個(gè)異常到catch子句是一個(gè)緩慢的過(guò)程,在理論上這種方法的實(shí)現(xiàn)對(duì)于這個(gè)過(guò)程來(lái)說(shuō)是效率最高的。因?yàn)樵趥鬟f異常信息時(shí),只有采用通過(guò)指針拋出異常的方法才能夠做到不拷貝對(duì)象,例如:

class exception { ... }; // 來(lái)自標(biāo)準(zhǔn)C++庫(kù)(STL)
 // 中的異常類層次
 void someFunction()
 {
  static exception ex; // 異常對(duì)象
  ...
  throw &ex; // 拋出一個(gè)指針,指向ex
  ...
 }
 void doSomething()
 {
  try {
   someFunction(); // 拋出一個(gè) exception*
  }
  catch (exception *ex) { // 捕獲 exception*;
   ... // 沒(méi)有對(duì)象被拷貝
  }
 }

  這看上去很不錯(cuò),但是實(shí)際情況卻不是這樣。為了能讓程序正常運(yùn)行,程序員定義異常對(duì)象時(shí)必須確保當(dāng)程序控制權(quán)離開拋出指針的函數(shù)后,對(duì)象還能夠繼續(xù)生存。全局與靜態(tài)對(duì)象都能夠做到這一點(diǎn),但是程序員很容易忘記這個(gè)約束。如果真是如此的話,他們會(huì)這樣寫代碼:

void someFunction()
{
 exception ex; // 局部異常對(duì)象;
 // 當(dāng)退出函數(shù)的生存空間時(shí)
 // 這個(gè)對(duì)象將被釋放。
 ...
 throw &ex; // 拋出一個(gè)指針,指向
 ... // 已被釋放的對(duì)象
}

  這簡(jiǎn)直糟糕透了,因?yàn)樘幚磉@個(gè)異常的catch子句接受到的指針,其指向的對(duì)象已經(jīng)不再存在。

  另一種拋出指針的方法是在建立一個(gè)堆對(duì)象(new heap object):

void someFunction()
{
 ...
 throw new exception; // 拋出一個(gè)指針,指向一個(gè)在堆中
 ... // 建立的對(duì)象(希望
}
// 自己不要再拋出一個(gè)
// 異常!)

  這避免了捕獲一個(gè)指向已被釋放對(duì)象的指針的問(wèn)題,但是catch子句的作者又面臨一個(gè)令人頭疼的問(wèn)題:他們是否應(yīng)該刪除他們接受的指針?如果是在堆中建立的異常對(duì)象,那他們必須刪除它,否則會(huì)造成資源泄漏。如果不是在堆中建立的異常對(duì)象,他們絕對(duì)不能刪除它,否則程序的行為將不可預(yù)測(cè)。該如何做呢?

  這是不可能知道的。一些clients可能會(huì)傳遞全局或靜態(tài)對(duì)象的地址,另一些可能轉(zhuǎn)遞堆中建立的異常對(duì)象的地址。通過(guò)指針捕獲異常,將遇到一個(gè)哈姆雷特式的難題:是刪除還是不刪除?這是一個(gè)難以回答的問(wèn)題。所以你最好避開它。

  而且,通過(guò)指針捕獲異常也不符合C++語(yǔ)言本身的規(guī)范。四個(gè)標(biāo)準(zhǔn)的異常 主站蜘蛛池模板: 台中县| 阜城县| 邵阳县| 永川市| 石景山区| 昆山市| 庆安县| 阜宁县| 尚志市| 霍州市| 保德县| 日喀则市| 图们市| 肥西县| 三原县| 汤阴县| 阿克苏市| 昌图县| 东源县| 木兰县| 那坡县| 长治县| 祁连县| 邵武市| 南江县| 大兴区| 乐都县| 平阳县| 东兰县| 土默特右旗| 库伦旗| 锡林郭勒盟| 鹰潭市| 鹿泉市| 浦江县| 光泽县| 永新县| 桐柏县| 方城县| 吴江市| 新和县|