<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
      許多種類的錯誤將觸發異常,這些問題從像硬盤(crash)墜毀這樣的嚴重硬件錯誤,到嘗試訪問越界數組元素這樣的簡單程序錯誤,像這樣的錯誤如果在java函數中發生,函數將創建一個異常對象并把他拋出到運行時系統(runtimesystem)。

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

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

      如果運行時系統搜尋整個調用堆棧都沒有找到合適的異常處理器,運行時系統將結束,隨之java程序也將結束。

      使用異常來管理錯誤,比傳統的錯誤管理技術有如下優勢:

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

      2. 沿著調用堆棧向上傳遞錯誤。

      3. 將錯誤分作,并區分錯誤類型。

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

      在傳統的程序種,錯誤偵測,報告,和處理,經常導致令人迷惑的意大利面條式(spaghetti)的代碼。例如,假設你要寫一個將這個文件讀到內存種的函數,用偽代碼描述,你的函數應該是這個樣子的:

      readFile

      open the file; //打開文件

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

      allocate that much memory; //分配內存

      read the file into memory; //讀文件內容到內存中

      close the file; //關閉文件

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

      n 文件不能打開將發生什么?

      n 文件大小不能取得將發生什么?

      n 沒有足夠的內存分配將發生什么?

      n 讀取失敗將發生什么?

      n 文件不能關閉將發生什么?

      為了在read_file函數中回答這些錯誤,你不得不加大量的代碼進行錯誤偵測,報告和處理,你的函數最后將看起來像這個樣子:

      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;

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

      對于錯誤管理,Java提供一種優雅的解決方案:異常。異常可以使你代碼中的主流程和處理異常情況的代碼分開。如果你用異常代替傳統的錯誤管理技術,readFile函數將像這個樣子:

      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;

      注意:異常并不能節省你偵測,報告和處理錯誤的努力。異常提供給你的是:當一些不正常的事情發生時,將所有蹩腳(grungy)的細節,從你的程序主邏輯流程中分開。

      另外,異常錯誤管理的膨脹系數大概是250%,比傳統的錯誤處理技術的400%少的多。

    tags:異常

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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲午夜未满十八勿入网站2| 免费在线观看污网站| 亚洲av无码成人精品区| 亚洲国产精品一区二区久| 十九岁在线观看免费完整版电影| 亚洲一区二区三区高清不卡| 亚洲国产精品专区在线观看 | 国产又黄又爽又大的免费视频 | 国内免费高清在线观看| 91精品国产亚洲爽啪在线影院| 无码专区永久免费AV网站 | 四虎www免费人成| 国产成人无码精品久久久免费| 免费一级毛片不卡在线播放| 无码av免费网站| 国产精品亚洲专区无码WEB| 中文精品人人永久免费| 亚洲国产精品yw在线观看| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 男男gay做爽爽的视频免费| 成人无码区免费A片视频WWW| 尤物视频在线免费观看| 亚洲人成www在线播放| 亚洲av中文无码乱人伦在线播放 | 久久午夜免费鲁丝片| 亚洲AV无码一区二区一二区| 久久青草亚洲AV无码麻豆| 成全视频在线观看免费高清动漫视频下载 | 五级黄18以上免费看| 亚洲人成77777在线观看网| 亚洲激情在线视频| 国产禁女女网站免费看| 伊人久久五月丁香综合中文亚洲 | 91精品免费国产高清在线| 亚洲人成高清在线播放| 亚洲色爱图小说专区| 国产精品免费看久久久久| 香蕉97超级碰碰碰免费公| 免费视频一区二区| 永久免费av无码入口国语片| 理论秋霞在线看免费|