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