五一節(jié)(2005年啦),新本本分到手了,于是咱就動(dòng)手裝系統(tǒng)了。OS換成了Windows2003,然后稀里花啦裝
了一堆軟件。裝完之后,配置一個(gè)缺陷管理軟件,載入原有數(shù)據(jù),然后就發(fā)現(xiàn)連接不上了。系統(tǒng)拋出一個(gè)第三方數(shù)據(jù)庫(kù)連接器封裝后的異常,說(shuō)是無(wú)法裝載驅(qū)動(dòng)程序。檢
查ODBC、檢查PATH,一切OK。把所有可能的目錄全改為EVERYONE完全控制,
還是無(wú)法裝載驅(qū)動(dòng)程序。OK,咱想不會(huì)是MDAC的問題吧,查看MDAC版本,啊呀,居然是2.8。記憶中好象2.8與老的ODBC驅(qū)動(dòng)有點(diǎn)不兼容,
DOWNGRADE也不成。唉,算了,咱重裝系統(tǒng)吧,在2000P上咱家裝這個(gè)軟件有很多次了,都沒有問題。反正是新本本,51也有時(shí)間。于是重裝OS,
DOWNGRADE為2000P,這一次咱就狡滑了一點(diǎn)點(diǎn),先裝這個(gè)有問題的軟件。裝完之后,一試,還是無(wú)法裝載驅(qū)動(dòng)程序。
這
下可暈菜了。一咬牙,重裝系統(tǒng),上2000Server。這樣連不上ORACLE,咱還可以移植到SQL Server。這一次裝完ORACLE之后,先
裝了一個(gè)數(shù)據(jù)庫(kù)訪問工具軟件,通過(guò)ODBC能訪問數(shù)據(jù)庫(kù)。太太地安心了,呵呵。于是裝Oracle
Manager。裝完發(fā)現(xiàn)用ODBC連不上庫(kù)了!系統(tǒng)拋出的異常是ORACLE自身的無(wú)此服務(wù)名。啊阿,原來(lái)是這樣地說(shuō)。
原來(lái)咱被第三方的連接器騙了!它捕獲了ORALE自身拋出的異常后,統(tǒng)一拋出了無(wú)法裝載驅(qū)動(dòng)程序的異常,這樣真實(shí)的原因就消失了。作為異常,它本身就應(yīng)該準(zhǔn)確地指出出現(xiàn)問題的地方的原因。不正確的封裝和處理,導(dǎo)致了毫無(wú)意義的異常。
想開了去,很多軟件都存在這樣的問題,比如下面的代碼:
?? for ?( int ?i = 0 ;i < items.length;i ++ ){
????checkItem(items[i]);
??}
}
public ? void ?checkItem(Item?item)? throws ?CheckException{
?? if ?(check?not?passed)
???? throw ? new ?CheckException( " Check?not?passed " );
}
上面的代碼中,拋出的異常正確地指明了異常類型,即檢查未通過(guò),但存在的問題是:哪一項(xiàng)的檢查未通過(guò)?如果ITEMS有數(shù)百項(xiàng),運(yùn)行過(guò)程中出了問題,又有誰(shuí)知道是哪一項(xiàng)的數(shù)據(jù)有問題?如果checkItem改一改就很好了,如:
?? if ?(check?not?passed)
???? throw ? new ?CheckException( " Check?not?passed,?item?is?: " ? + ?item.getName());
}