作者楊中科是CowNew開源團隊JDBMonitor項目組的開發人員。
CowNew開源團隊網站
http://www.cownew.com論壇
http://www.cownew.com/newpeng/轉載請注明此版權信息
? 有一定開發經驗的朋友在處理異常的時候都不會直接寫個e.printstacktrace()來“捕獲”異常,但是在有些情況下是“無法拋出”異常的,比如一些重載基類的一些方法,但是這些方法是沒有聲明異常拋出的,或者在類的static初始化塊的時候也是“無法拋出”異常的。其實“無法拋出異常”的地方還是能拋出運行時異常的。
最好用的數據庫監控、日志工具JDBMonitor就是通過這種方式解決此問題的。JDBMonitor的二進制jar包和源代碼都可以從 http://www.cownew.com 下載得到。
JDBMonitor在CommonUtils總定義了一個toRuntimeException方法,用來把異常轉換成運行時異常:
public static RuntimeException toRuntimeException(Throwable e)
{
?RuntimeException re = new RuntimeException(e);
?re.setStackTrace(e.getStackTrace());
?return re;
}
讓我們首先打開com.cownew.JDBMonitor.jdbc.DBDriver,然后定位到代碼的最后
static
{
??? try
??? {
?DriverManager.registerDriver(new DBDriver());
??? } catch (Exception e)
??? {
?throw CommonUtils.toRuntimeException(e);
??? }
}
這是在類的初始化塊中向DriverManager注冊JDBC驅動,在初始化塊中是不能聲明拋出異常的,因此JDBMonitor將異常轉化為RuntimeException異常拋出。這樣就做到了不放過任何一個異常。
再打開:
com.cownew.JDBMonitor.listenerImpl.sckListenerClient.ListenerClient.java中的SocketListener類,其中的run方法是實現的Runnable接口中的方法,而Runnable接口中的Run方法是沒有聲明異常的,因此JDBMonitor也是采用的轉換成RuntimeException的方式進行的異常處理:
public void run()
{
? try
? {
?...
? } catch (IOException e)
? {
??? throw CommonUtils.toRuntimeException(e);
? } catch (ClassNotFoundException e)
? {
??? throw CommonUtils.toRuntimeException(e);
? }
}