作者杨中科是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);
}
}