WEB开发网
开发学院软件开发Java Java 理论与实践: 平衡测试,第 2 部分:编写和优... 阅读

Java 理论与实践: 平衡测试,第 2 部分:编写和优化 bug 检测器

 2010-01-11 00:00:00 来源:WEB开发网   
核心提示: 标识捕获的异常像上个月的操作一样,您可以通过创建 BytecodeScanningDetector 基础类(可实现 Visitor 模式)的子类启动 bug 检测器,Java 理论与实践: 平衡测试,第 2 部分:编写和优化 bug 检测器(4),在 BytecodeScanningDetect

标识捕获的异常

像上个月的操作一样,您可以通过创建 BytecodeScanningDetector 基础类(可实现 Visitor 模式)的子类启动 bug 检测器。在 BytecodeScanningDetector 中有一个 visit(Code) 方法,并且在每次发现 catch 块时,该实现都会调用 visit(CodeException)。如果重写 visit(Code),并从那里调用 super.visit(Code),则当超类 visit(Code) 返回时,它将调用用于该方法中所有 catch 块的 visit(CodeException)。清单 4 了显示实现 visit(Code) 和 visit(CodeException) 的第一步,它将积累方法中所有 catch 块的信息。每个 CodeException 都包含相应 try 块的起始和终止的字节码偏移量,这样您可以方便地确定哪一个 CodeException 对象与 try-catch 块对应。


清单 4. 第一版 RuntimeException 捕获检测器可以收集某一方法中抛出的异常信息
public class RuntimeExceptionCapture extends BytecodeScanningDetector { 
 private BugReporter bugReporter; 
 private Method method; 
 private OpcodeStack stack = new OpcodeStack(); 
 private List<ExceptionCaught> catchList; 
 private List<ExceptionThrown> throwList; 
 
 public void visitMethod(Method method) { 
  this.method = method; 
  super.visitMethod(method)  } 
 
 public void visitCode(Code obj) { 
  catchList = new ArrayList<ExceptionCaught>(); 
  throwList = new ArrayList<ExceptionThrown>(); 
  stack.resetForMethodEntry(this); 
 
  super.visitCode(obj); 
  // At this point, we've identified all the catch blocks 
  // More to come... 
 } 
 
 public void visit(CodeException obj) { 
  super.visit(obj); 
  int type = obj.getCatchType(); 
  if (type == 0) return; 
  String name = 
   getConstantPool().constantToString(getConstantPool().getConstant(type)); 
 
  ExceptionCaught caughtException = 
   new ExceptionCaught(name, obj.getStartPC(), obj.getEndPC(), obj.getHandlerPC()); 
  catchList.add(caughtException); 
 } 
} 

上一页  1 2 3 4 5 6 7  下一页

Tags:Java 理论 实践

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接