background image

 

该 方 法 中 所 有 catch  

 

块 的 visit(CodeException)

 

。 清 单 4  

 

了 显 示 实 现 visit(Code)   和 

visit(CodeException) 

 

的第一步,它将积累方法中所有 catch 

 

块的信息。每个 CodeException 

 

都 包含 相应 try  块 的起 始和 终止 的字 节码 偏移 量, 这样 您可 以方 便地 确定 哪一 个 
CodeException 

 

对象与 try-catch 块对应。

 

  清单 4. 

 

第一版 RuntimeException 捕获检测器可以收集某一方法中抛出的异常信

1 public class RuntimeExceptionCapture extends BytecodeScanningDetector {
2   private BugReporter bugReporter;
3   private Method method;
4   private OpcodeStack stack = new OpcodeStack();
5   private List<ExceptionCaught> catchList;
6   private List<ExceptionThrown> throwList;
7
8   public void visitMethod(Method method) {
9     this.method = method;
10     super.visitMethod(method)         }
11
12   public void visitCode(Code obj) {
13     catchList = new ArrayList<ExceptionCaught>();
14     throwList = new ArrayList<ExceptionThrown>();
15     stack.resetForMethodEntry(this);
16
17     super.visitCode(obj);
18     // At this point, we've identified all the catch blocks
19     // More to come...
20   }
21
22   public void visit(CodeException obj) {
23     super.visit(obj);
24     int type = obj.getCatchType();
25     if (type == 0) return;
26     String name =
27       getConstantPool().constantToString(getConstantPool().getConstant(type));
28
29     ExceptionCaught caughtException =
30       new ExceptionCaught(name, obj.getStartPC(), obj.getEndPC(), obj.getHandlerPC());
31     catchList.add(caughtException);
32   }
33 }
34