五一节(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());
}