该 方 法 中 所 有 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