<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0
      許多種類的錯(cuò)誤將觸發(fā)異常,這些問題從像硬盤(crash)墜毀這樣的嚴(yán)重硬件錯(cuò)誤,到嘗試訪問越界數(shù)組元素這樣的簡單程序錯(cuò)誤,像這樣的錯(cuò)誤如果在java函數(shù)中發(fā)生,函數(shù)將創(chuàng)建一個(gè)異常對象并把他拋出到運(yùn)行時(shí)系統(tǒng)(runtimesystem)。

      許多種類的錯(cuò)誤將觸發(fā)異常,這些問題從像硬盤(crash)墜毀這樣的嚴(yán)重硬件錯(cuò)誤,到嘗試訪問越界數(shù)組元素這樣的簡單程序錯(cuò)誤,像這樣的錯(cuò)誤如果在java函數(shù)中發(fā)生,函數(shù)將創(chuàng)建一個(gè)異常對象并把他拋出到運(yùn)行時(shí)系統(tǒng)(runtimesystem)。異常對象包含異常的信息,包括異常的類型,異常發(fā)生時(shí)程序的狀態(tài)。運(yùn)行時(shí)系統(tǒng)則有責(zé)任找到一些代碼處理這個(gè)錯(cuò)誤。在java技術(shù)詞典中,創(chuàng)建一個(gè)異常對象并把它拋給運(yùn)行時(shí)系統(tǒng)叫做:拋出異常(throwinganexception)。

      當(dāng)某個(gè)函數(shù)拋出一個(gè)異常后,運(yùn)行時(shí)系統(tǒng)跳入了這樣一個(gè)動(dòng)作,就是找到一些人(譯者注:其實(shí)是代碼)來處理這個(gè)異常。要找的處理異常的可能的人(代碼)的集合(set)是:在發(fā)生異常的方法的調(diào)用堆棧(callstack)中的方法的集合(set)。運(yùn)行時(shí)系統(tǒng)向后搜尋調(diào)用堆棧,從錯(cuò)誤發(fā)生的函數(shù),一直到找到一個(gè)包括合適的異常處理器(exceptionhandler)的函數(shù)。一個(gè)異常處理器是否合適取決于拋出的異常是否和異常處理器處理的異常是同一種類型。因而異常向后尋找整個(gè)調(diào)用堆棧,直到一個(gè)合格的異常處理器被找到,調(diào)用函數(shù)處理這個(gè)異常。異常處理器的選擇被叫做:捕獲異常(catchtheexception)。

      如果運(yùn)行時(shí)系統(tǒng)搜尋整個(gè)調(diào)用堆棧都沒有找到合適的異常處理器,運(yùn)行時(shí)系統(tǒng)將結(jié)束,隨之java程序也將結(jié)束。

      使用異常來管理錯(cuò)誤,比傳統(tǒng)的錯(cuò)誤管理技術(shù)有如下優(yōu)勢:

      1. 將錯(cuò)誤處理代碼于正常的代碼分開。

      2. 沿著調(diào)用堆棧向上傳遞錯(cuò)誤。

      3. 將錯(cuò)誤分作,并區(qū)分錯(cuò)誤類型。

      1. 將錯(cuò)誤處理代碼于正常的代碼分開。

      在傳統(tǒng)的程序種,錯(cuò)誤偵測,報(bào)告,和處理,經(jīng)常導(dǎo)致令人迷惑的意大利面條式(spaghetti)的代碼。例如,假設(shè)你要寫一個(gè)將這個(gè)文件讀到內(nèi)存種的函數(shù),用偽代碼描述,你的函數(shù)應(yīng)該是這個(gè)樣子的:

      readFile

      open the file; //打開文件

      determine its size; //取得文件的大小

      allocate that much memory; //分配內(nèi)存

      read the file into memory; //讀文件內(nèi)容到內(nèi)存中

      close the file; //關(guān)閉文件

      匆匆一看,這個(gè)版本是足夠的簡單,但是它忽略了所有潛在的問題:

      n 文件不能打開將發(fā)生什么?

      n 文件大小不能取得將發(fā)生什么?

      n 沒有足夠的內(nèi)存分配將發(fā)生什么?

      n 讀取失敗將發(fā)生什么?

      n 文件不能關(guān)閉將發(fā)生什么?

      為了在read_file函數(shù)中回答這些錯(cuò)誤,你不得不加大量的代碼進(jìn)行錯(cuò)誤偵測,報(bào)告和處理,你的函數(shù)最后將看起來像這個(gè)樣子:

      errorCodeType readFile

      initialize errorCode = 0;

      open the file;

      if (theFileIsOpen)

      determine the length of the file;

      if (gotTheFileLength)

      allocate that much memory;

      if (gotEnoughMemory)

      read the file into memory;

      if (readFailed)

      errorCode = -1;

      else

      errorCode = -2;

      else

      errorCode = -3;

      close the file;

      if (theFileDidntClose && errorCode 0)

      errorCode = -4;

      else

      errorCode = errorCode and -4;

      else

      errorCode = -5;

      return errorCode;

      隨著錯(cuò)誤偵測的建立,你的最初的7行代碼(粗體)已經(jīng)迅速的膨脹到了29行-幾乎400%的膨脹率。更糟糕的是有這樣的錯(cuò)誤偵測,報(bào)告和錯(cuò)誤返回值,使得最初有意義的7行代碼淹沒在混亂之中,代碼的邏輯流程也被淹沒。很難回答代碼是否做的正確的事情:如果函數(shù)分配內(nèi)容失敗,文件真的將被關(guān)閉嗎?更難確定當(dāng)你在三個(gè)月后再次修改代碼,它是否還能夠正確的執(zhí)行。許多程序員“解決”這個(gè)問題的方法是簡單的忽略它,那樣錯(cuò)誤將以死機(jī)來報(bào)告自己。

      對于錯(cuò)誤管理,Java提供一種優(yōu)雅的解決方案:異常。異??梢允鼓愦a中的主流程和處理異常情況的代碼分開。如果你用異常代替?zhèn)鹘y(tǒng)的錯(cuò)誤管理技術(shù),readFile函數(shù)將像這個(gè)樣子:

      readFile

      try

      open the file;

      determine its size;

      allocate that much memory;

      read the file into memory;

      close the file;

      catch (fileOpenFailed)

      doSomething;

      catch (sizeDeterminationFailed)

      doSomething;

      catch (memoryAllocationFailed)

      doSomething;

      catch (readFailed)

      doSomething;

      catch (fileCloseFailed)

      doSomething;

      注意:異常并不能節(jié)省你偵測,報(bào)告和處理錯(cuò)誤的努力。異常提供給你的是:當(dāng)一些不正常的事情發(fā)生時(shí),將所有蹩腳(grungy)的細(xì)節(jié),從你的程序主邏輯流程中分開。

      另外,異常錯(cuò)誤管理的膨脹系數(shù)大概是250%,比傳統(tǒng)的錯(cuò)誤處理技術(shù)的400%少的多。

    tags:異常

    posted on 2009-06-25 23:45 jadmin 閱讀(77) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产性爱在线观看亚洲黄色一级片 | 在线亚洲97se亚洲综合在线| 日韩电影免费在线观看网站| 亚洲福利秒拍一区二区| 国产美女无遮挡免费视频| a一级爱做片免费| 亚洲最大中文字幕| 亚洲VA综合VA国产产VA中| 最刺激黄a大片免费网站| 亚洲av纯肉无码精品动漫| 亚洲av无码一区二区三区乱子伦| 一个人在线观看视频免费| www在线观看播放免费视频日本| 久久久亚洲AV波多野结衣| 免费A级毛片在线播放不收费| 国产亚洲免费的视频看| 亚洲国产精品精华液| 亚洲va中文字幕无码久久| 成人免费视频国产| 99视频免费观看| 美女被免费网站在线视频免费| 久久亚洲私人国产精品| 亚洲国产成人精品无码久久久久久综合 | 精品香蕉在线观看免费| 精品国产呦系列在线观看免费 | 亚洲精品二三区伊人久久| 国产成人综合亚洲AV第一页 | 亚洲精品9999久久久久无码| 国产成人A人亚洲精品无码| 在线观看免费成人| 69影院毛片免费观看视频在线| 一级毛片视频免费观看| 亚洲av日韩专区在线观看| 亚洲成人动漫在线观看| 亚洲精品卡2卡3卡4卡5卡区| 国产成人啪精品视频免费网| 99热在线精品免费全部my| 免费视频成人片在线观看| 成在线人视频免费视频| 国产亚洲高清在线精品不卡| 亚洲综合激情五月色一区|