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

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

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

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

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

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

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

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

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

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

            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)閉文件

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

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

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

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

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

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

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

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

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

            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é)省你偵測,報告和處理錯誤的努力。異常提供給你的是:當(dāng)一些不正常的事情發(fā)生時,將所有蹩腳(grungy)的細節(jié),從你的程序主邏輯流程中分開。

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

          tags:異常

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高清| 海盐县| 崇左市| 天柱县| 松阳县| 平山县| 通道| 瓦房店市| 贵德县| 武汉市| 芒康县| 霞浦县| 黄山市| 柳江县| 威远县| 巴中市| 武胜县| 靖西县| 荆门市| 瑞安市| 杭州市| 德安县| 大连市| 大宁县| 岐山县| 治县。| 大竹县| 武夷山市| 香港 | 神农架林区| 诸暨市| 松阳县| 宽城| 印江| 乐业县| 东辽县| 嘉义县| 沾化县| 东乡| 泽州县| 荥阳市|