1.8 違例控制:解決錯(cuò)誤
從最古老的程序設(shè)計(jì)語(yǔ)言開(kāi)始,錯(cuò)誤控制一直都是設(shè)計(jì)者們需要解決的一個(gè)大問(wèn)題。由于很難設(shè)計(jì)出一套完美的錯(cuò)誤控制方案,許多語(yǔ)言干脆將問(wèn)題簡(jiǎn)單地忽略掉,將其轉(zhuǎn)嫁給庫(kù)設(shè)計(jì)人員。對(duì)大多數(shù)錯(cuò)誤控制方案來(lái)說(shuō),最主要的一個(gè)問(wèn)題是它們嚴(yán)重依賴程序員的警覺(jué)性,而不是依賴語(yǔ)言本身的強(qiáng)制標(biāo)準(zhǔn)。如果程序員不夠警惕——若比較匆忙,這幾乎是肯定會(huì)發(fā)生的——程序所依賴的錯(cuò)誤控制方案便會(huì)失效。
“違例控制”將錯(cuò)誤控制方案內(nèi)置到程序設(shè)計(jì)語(yǔ)言中,有時(shí)甚至內(nèi)建到操作系統(tǒng)內(nèi)。這里的“違例”(Exception)屬于一個(gè)特殊的對(duì)象,它會(huì)從產(chǎn)生錯(cuò)誤的地方“扔”或“擲”出來(lái)。隨后,這個(gè)違例會(huì)被設(shè)計(jì)用于控制特定類型錯(cuò)誤的“違例控制器”捕獲。在情況變得不對(duì)勁的時(shí)候,可能有幾個(gè)違例控制器并行捕獲對(duì)應(yīng)的違例對(duì)象。由于采用的是獨(dú)立的執(zhí)行路徑,所以不會(huì)干擾我們的常規(guī)執(zhí)行代碼。這樣便使代碼的編寫(xiě)變得更加簡(jiǎn)單,因?yàn)椴槐亟?jīng)常性強(qiáng)制檢查代碼。除此以外,“擲”出的一個(gè)違例不同于從函數(shù)返回的錯(cuò)誤值,也不同于由函數(shù)設(shè)置的一個(gè)標(biāo)志。那些錯(cuò)誤值或標(biāo)志的作用是指示一個(gè)錯(cuò)誤狀態(tài),是可以忽略的。但違例不能被忽略,所以肯定能在某個(gè)地方得到處置。最后,利用違例能夠可靠地從一個(gè)糟糕的環(huán)境中恢復(fù)。此時(shí)一般不需要退出,我們可以采取某些處理,恢復(fù)程序的正常執(zhí)行。顯然,這樣編制出來(lái)的程序顯得更加可靠。
Java的違例控制機(jī)制與大多數(shù)程序設(shè)計(jì)語(yǔ)言都有所不同。因?yàn)樵贘ava中,違例控制模塊是從一開(kāi)始就封裝好的,所以必須使用它!如果沒(méi)有自己寫(xiě)一些代碼來(lái)正確地控制違例,就會(huì)得到一條編譯期出錯(cuò)提示。這樣可保證程序的連貫性,使錯(cuò)誤控制變得更加容易。
注意違例控制并不屬于一種面向?qū)ο蟮奶匦?,盡管在面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,違例通常是用一個(gè)對(duì)象表示的。早在面向?qū)ο笳Z(yǔ)言問(wèn)世以前,違例控制就已經(jīng)存在了。