Java 理论与实践: 平衡测试,第 2 部分:编写和优化 bug 检测器
2010-01-11 00:00:00 来源:WEB开发网标识捕获的异常
像上个月的操作一样,您可以通过创建 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);
}
}
更多精彩
赞助商链接