快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
clazz = Class.forName(className);      objectSet.add(clazz.newInstance());    }    catch (Exception e) {      logger.log("Exception in newInstance", e);    } }

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

时间:2010-12-22 IBM Brian Goetz

bug 模式通常源自语言的模糊功能或类库;出现此 bug 模式是因为 RuntimeException 扩展了 Exception,这稍微有点违反常理。对 RuntimeException 捕获的修复非常容易 —— 您需要了解以下问题:首先捕获 RuntimeException,并在捕获 Exception 之前重新将其抛出,如清单 3 所示。不过,即使知道 bug 模式及其修复方法,在代码审查过程中也很容易忘记执行 它或忽略它,并且编译器也不会通知您。这是引入 bug 模式的原因,帮助您避 免违犯 “您已较好地了解” 之类的错误。

清单 3. 通过显式处理 RuntimeException 修复 RuntimeException 捕获

public void addInstance(String className) {    try {      Class clazz = Class.forName(className);      objectSet.add(clazz.newInstance());    }    catch (RuntimeException e) {      throw e;    }    catch (Exception e) {      logger.log("Exception in newInstance", e);    } }

编写 RuntimeException 捕获检测器

正如您在 上一期 中所学的,编写 bug 模式的第一个步骤是清楚地标识 bug 模式。在这里,bug 模式是捕获 Exception 的 catch 块,这时不存在用于 RuntimeException 的相应捕获块,并且尝试块中的任何方法调用或 throw 语句 都不会抛出 Exception。要检测此 bug 模式,则需要知道 try-catch 块的位置 、try 块可能抛出的内容以及在 catch 块中将捕获的内容。

标识捕获的异常

像上个月的操作一样,您可以通过创建 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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号