众所周知,防御性编程是一个编程的最佳实践。良好的防御性编程,可以增强程序的健壮性,但是没有银弹,最佳实践也有一个适用场景的问题。
试看如下代码:
/**
* 异常处理接口。
* */
public interface ExceptionHandler {
/**
* 是否处理该异常。
* */
public boolean aboutToHandle(Exception ex);
/**
* 处理异常。
* */
public void handle(Exception ex);
}
/**
* 默认异常处理器。
* */
public class DefaultExceptionHandler implements ExceptionHandler {
// get exceptionHandlerList from config file or somewhere.
private List<ExceptionHandler> exceptionHandlerList;
@Override
public boolean aboutToHandle(Exception ex) {
return true;
}
@Override
public void handle(Exception ex) {
for (ExceptionHandler exceptionHandler : exceptionHandlerList) {
if (exceptionHandler.aboutToHandle(ex)) {
exceptionHandler.handle(ex);
return;
}
}
}
}
/**
* 空指针异常处理器。
* */
public class NullPointerExceptionHandler_0 implements ExceptionHandler {
@Override
public boolean aboutToHandle(Exception ex) {
if (ex instanceof NullPointerException) {
return true;
}
return false;
}
@Override
public void handle(Exception ex) {
NullPointerException exception = null;
if (ex instanceof NullPointerException) {
exception = (NullPointerException) ex;
}
if (exception == null) {
return;
}
// 其他处理
}
}
这段代码是一段很通用的异常处理代码,接口的定义很简洁,aboutToHandle方法来确定是否由该异常处理器来处理该异常,handle方法是实际的异常处理方法。DefaultExceptionHandler这个异常处理器实际上起着一个分发异常的作用,是这个异常处理机制的核心。
初看这段代码,会认为这段代码和大多数的异常处理机制大同小异,没有什么问题。细致的检查之后,这段代码还是有它的缺点的。
1 NullPointerExceptionHandler的aboutToHandle方法体不够简洁。
2 NullPointerExceptionHandler的handle方法中用了防御性编程,在该特定场景中防御性代码是冗余的。
一般而言,异常处理系统是作为基础子系统存在的,不应该被外界的代码随意调用。因此,异常处理的具体实现应该信任作为该系统中的核心类(该处为DefaultExceptionHandler)的功能。即分发给一个处理器的异常,一定是可以通过该处理器aboutToHandle方法测试通过的,如果该条件不满足,aboutToHandle方法的存在本身也就没有意义了。该方法本身就是对异常处理器可以处理哪些异常的一个抽象。
基于以上理解,代码修改如下:
/**
* 重构后的空指针异常处理器。
* */
public class NullPointerExceptionHandler_1 implements ExceptionHandler {
@Override
public boolean aboutToHandle(Exception ex) {
return (ex instanceof NullPointerException);
}
@Override
public void handle(Exception ex) {
NullPointerException exception = (NullPointerException) ex;
// 其他处理
}
}
分享到:
相关推荐
- **成帧与解析**:在网络通信中,经常需要将消息分成多个较小的数据段(即帧),并在接收端重新组合这些帧以重构原始消息。 - **Java特定编码**:Java提供了多种方式来处理特定类型的数据编码,例如使用`...
本文将详细介绍Python中的代码重构及其自动化工具的应用,帮助开发者掌握这一重要的实践技能。 #### 二、代码重构的重要性 代码重构对于软件开发来说至关重要。它不仅能提高代码的质量,还能确保项目的长期可维护...
这些书籍提供了丰富的重构模式和步骤,帮助开发者在实践中避免常见的陷阱,确保重构过程的安全性。 在压缩包的文件名称列表中提到的 "prog",可能是指程序或编程相关的文件。在实际学习过程中,我们可以打开这些...
**设计模式** 是经验丰富的开发者在长期实践中总结出来的通用解决方案。这些模式描述了在某些特定情况下,如何在面向对象设计中解决问题。主要分为三类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如...
在Ruby社区中,惯用法(idioms)和最佳实践(best practices)是提高代码质量的关键。本文将深入探讨Ruby中的关键技巧、重构方法以及遵循的代码风格指南。 一、Ruby技巧 1. 块和迭代器:Ruby中的块(blocks)和...
本《高质量C++/C编程指南》将深入探讨如何在实践中实现这些目标,帮助开发者避免常见的陷阱并提升编程技能。 一、C++与C语言基础 C++是在C语言基础上发展起来的,它引入了类、模板、异常处理等面向对象特性,同时...
异常处理是Java编程中不可或缺的一部分,正确的异常处理可以显著提升程序的健壮性和用户体验。在上述代码片段中,可以看到一个典型的异常处理模式: ```java OutputStreamWriter out = null; java.sql.Connection ...
这些知识点构成了C++编程实践中不可或缺的一部分,理解和应用这些规则和最佳实践,有助于提升C++程序员的专业素养和项目成功率。通过不断学习和实践,开发者可以编写出更加高效、健壮且易于维护的C++程序。
在VC++编程中,开发者需要掌握一系列技巧和最佳实践,以提高代码的效率、可读性和可维护性。本文将深入探讨这些关键知识点,并通过范例进行解释。 1. **面向对象编程**:VC++是C++的一个实现,支持面向对象编程...
书中介绍了如何通过重构提高代码质量,包括提取函数、替换魔术数字、消除重复代码等实践技巧。 10. **性能优化**:除了语法和设计原则,书中还可能涉及性能优化技巧,如避免不必要的内存拷贝,使用const关键字,...
在编程世界中,Groovy是一种基于Java平台的动态和强大的编程语言,它具有简洁的语法、灵活的类型系统以及对Java代码的无缝集成。...在Groovy的实践中,熟练掌握闭包的运用将大大提升我们的编程技能。
总的来说,《VC++编程技巧与范例》这本书旨在通过实例教学,使读者能够在实践中学习和掌握VC++编程。对于每一个范例,读者应深入研究其代码逻辑,理解为什么要这样设计,并尝试修改和扩展,以增强自己的编程能力。...
《高质量C/C++编程指南》是由著名程序员林锐编著的一本经典编程书籍,旨在帮助开发者遵循最佳实践,提升C/C++代码的质量和可维护性。本书深入探讨了C/C++编程中的各种技术和策略,旨在避免常见错误,提高程序效率,...
C++是一种强大的、通用的编程语言,被广泛应用于系统软件、应用软件、游戏开发、设备驱动等各个领域。为了写出高效、可维护的C++代码...通过深入学习和实践这两本书中的内容,C++程序员可以进一步提升自己的专业技能。
- **代码重构**:由于API的不同,代码需要进行大幅度的重构。例如,处理用户界面的方式在两个平台上截然不同。 - **资源管理**:Symbian OS在资源管理上有自己独特的一套机制,需要学习和适应。 - **异常处理**:...
《C++高效编程》是一本深入探讨如何在C++编程中实现高效代码的重要参考资料,尤其适合已有一定C++基础并希望提升编程效率的开发者。这本书不仅涵盖了语言的基础知识,更着重于最佳实践、性能优化以及代码可维护性的...
《高质量C/C++编程指南》是由上海贝尔实验室的著名计算机科学家林锐博士撰写的一部深度解析C/C++编程技巧和最佳实践的文档。这部指南旨在帮助程序员避免常见错误,提升代码质量和可维护性,深入理解语言的核心概念。...
**JavaScript模块化与Sea.js详解** 在Web开发中,随着项目规模的扩大,代码的组织和管理变得越来越重要。JavaScript作为浏览器端的主要脚本语言,其...在实践中不断学习和应用,能够帮助你更好地应对大型项目的挑战。
《Visual C++高级编程技巧与实例》是一本深入探讨C++在...通过学习上述知识点,并结合提供的《Visual C++高级编程技巧与实例》中的样例代码,开发者可以深入理解并掌握VC++的高级特性和最佳实践,提升编程能力。