從最古老的程序設(shè)計語言開始晶府,錯誤控制一直都是設(shè)計者們需要解決的一個大問題。由于很難設(shè)計出一套完美的錯誤控制方案驼唱,許多語言干脆將問題簡單地忽略掉寇损,將其轉(zhuǎn)嫁給庫設(shè)計人員凸郑。對大多數(shù)錯誤控制方案來說,最主要的一個問題是它們嚴重依賴程序員的警覺性矛市,而不是依賴語言本身的強制標準芙沥。如果程序員不夠警惕——若比較匆忙,這幾乎是肯定會發(fā)生的——程序所依賴的錯誤控制方案便會失效浊吏。
“違例控制”將錯誤控制方案內(nèi)置到程序設(shè)計語言中而昨,有時甚至內(nèi)建到操作系統(tǒng)內(nèi)。這里的“違例”(Exception)屬于一個特殊的對象找田,它會從產(chǎn)生錯誤的地方“扔”或“擲”出來歌憨。隨后,這個違例會被設(shè)計用于控制特定類型錯誤的“違例控制器”捕獲墩衙。在情況變得不對勁的時候务嫡,可能有幾個違例控制器并行捕獲對應(yīng)的違例對象。由于采用的是獨立的執(zhí)行路徑漆改,所以不會干擾我們的常規(guī)執(zhí)行代碼心铃。這樣便使代碼的編寫變得更加簡單,因為不必經(jīng)常性強制檢查代碼挫剑。除此以外去扣,“擲”出的一個違例不同于從函數(shù)返回的錯誤值,也不同于由函數(shù)設(shè)置的一個標志樊破。那些錯誤值或標志的作用是指示一個錯誤狀態(tài)愉棱,是可以忽略的唆铐。但違例不能被忽略,所以肯定能在某個地方得到處置奔滑。最后或链,利用違例能夠可靠地從一個糟糕的環(huán)境中恢復(fù)。此時一般不需要退出档押,我們可以采取某些處理,恢復(fù)程序的正常執(zhí)行祈纯。顯然令宿,這樣編制出來的程序顯得更加可靠。
Java的違例控制機制與大多數(shù)程序設(shè)計語言都有所不同腕窥。因為在Java中粒没,違例控制模塊是從一開始就封裝好的,所以必須使用它簇爆!如果沒有自己寫一些代碼來正確地控制違例癞松,就會得到一條編譯期出錯提示。這樣可保證程序的連貫性入蛆,使錯誤控制變得更加容易响蓉。
注意違例控制并不屬于一種面向?qū)ο蟮奶匦裕M管在面向?qū)ο蟮某绦蛟O(shè)計語言中哨毁,違例通常是用一個對象表示的枫甲。早在面向?qū)ο笳Z言問世以前,違例控制就已經(jīng)存在了扼褪。