作者杨中科是CowNew开源团队JDBMonitor项目组的开发人员。
CowNew开源团队网站 [url]http://www.cownew.com[/url]
论坛 [url]http://www.cownew.com/newpeng/[/url]
转载请注明此版权信息
  有一定开发经验的朋友在处理异常的时候都不会直接写个e.printstacktrace()来“捕获”异常,但是在有些情况下是“无法抛出”异常的,比如一些重载基类的一些方法,但是这些方法是没有声明异常抛出的,或者在类的static初始化块的时候也是“无法抛出”异常的。其实“无法抛出异常”的地方还是能抛出运行时异常的。
最好用的数据库监控、日志工具JDBMonitor就是通过这种方式解决此问题的。JDBMonitor的二进制jar包和源代码都可以从 [url]http://www.cownew.com[/url] 下载得到。
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);
  }
}