类属catch子句的另一个后果是记录受到限制因为catch并不知道被捕捉的特殊异常。有些程序员在面对这种问题的时候,总是添加一个查看异常类型的检查(如Listing 4),这是与使用catch块的初衷相违背的:
  Listing 4
  catch(Exception e){
  if(e instanceof ClassNotFoundException){
  log.error("Invalid class name:"+className+","+e.toString());
  }
  else{
  log.error("Cannot create class:"+className+","+e.toString());
  }
  }
  Listing 5提供了一个特例,可能有些程序员会感兴趣。他不需要instanceof操作器因为它可以捕捉到特殊异常。每一个检查过的异常(ClassNotFoundException、InstantiationException、IllegalAccessException)都被捕捉并得到处理。产生ClassCastException(类完全装载,但是并不执行SomeInterface接口)的特殊情况也可以通过检查该异常得以校验。
  Listing 5
  public SomeInterface buildInstance(String className){
  SomeInterface impl=null;
  try{
  Class clazz=Class.forName(className);
  impl=(SomeInterface)clazz.newInstance();
  }
  catch(ClassNotFoundException e){
  log.error("Invalid class name:"+className+","+e.toString());
  }
  catch(InstantiationException e){
  log.error("Cannot create class:"+className+","+e.toString());
  }
  catch(IllegalAccessException e){
  log.error("Cannot create class:"+className+","+e.toString());
  }
  catch(ClassCastException e){
  log.error("Invalid class type,"+className
  +"does not implement"+SomeInterface.class.getName());
  }
  return impl;
  }
  在某些情况下,再次给出已知异常(或者创建新异常)比在方法中处理该异常更可取。这就使得调用方法可通过将异常放入一个已知的上下文中来处理异常。
  以下的Listing 6提供了buildInterface()方法的备选版本,在装载和初始化类的过程中如果出现问题它就会给出ClassNotFoundException。在本例中,调用方法确实收到一个恰当的初始化的对象或者异常。因此,调用方法不需要检查返回对象是否为空。
  注意:此例使用了Java 1.4方法:创建一个新的异常,它包裹在另一个异常之内,以便保存原始的堆栈路径信息。否则,堆栈路径显示方法buildInstance()创建了异常,而实际上应该是newInstance()产生了潜在的异常: