`
禹爸爸
  • 浏览: 87403 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

异常处理策略与重构

阅读更多

异常处理策略

系统异常可以分为两大类:业务类异常技术类异常。顾名思义,业务类异常可以理解为在进行业务逻辑处理时,出现的异常。如创建客户订单时,发现没有为这个客户设置价格;取款时,取款金额大于帐户余额等。

技术类异常就更好理解了,这一层是与技术人员相关的,对系统使用者而言,应该是透明的。如无法正确连接数据库;访问数组或是列表时,索引超出范围;进行计算时,除数为零等。

 

针对不同类类型的异常,我们会采取不同的处理策略,请参照下表。

  可预测异常 不可预测异常
业务类异常
  • 在发生异常处处理
  • 将异常信息显示给用户
  • 不要记录在日志中
  • 抛出异常
  • 将异常信息显示给用户
  • 记录在日志中
技术类异常
  • 在发生异常处处理
  • 不要将异常信息显示给用户
  • 不要记录在日志中
  • 抛出异常
  • 不要将异常显示给用户
  • 记录在日志中

 

异常重构

在讲异常重构之前,我们先看下面这段代码

public void writeFile(String fileName, String data) {
	FileWriter writer = null;
	writer = new FileWriter(fileName);
	writer.write(data);
}

 这样的写法是无法通编译的,因为在FileWriter的write方法定义的时候声明了抛出IOException异常,编译器要求我们必须在调用的地方处理这个异常。

public void writeFile(String fileName, String data)  {
	FileWriter writer = null;
	try {
		writer = new FileWriter(fileName);
		writer.write(data);
	} catch (IOException e) {
		//todo
	}
}

或是在我们自定义的方法头中明确声明此异常。

public void writeFile(String fileName, String data) throws IOException {
	FileWriter writer = null;
	writer = new FileWriter(fileName);
	writer.write(data);
}

或是在调用的地方处理此异常。

 

对于第一种作法,我们并没有对异常进行作何处理,只是使用try catch语句捕获异常,并注明todo,待日后处理,但是时间一久,很容易就被遗忘了。有的小伙伴可能会说在catch语句中使用继续将该异常抛出

public void writeFile(String fileName, String data)  {
	FileWriter writer = null;
	try {
		writer = new FileWriter(fileName);
		writer.write(data);
	} catch (IOException e) {
		throw e;
	}
}

这样的做法不可取,因为这会让问题又回到了原点,在调用writeFile的函数中还是要处理我们抛出的异常呀!

 

第二种方法,和使用throw e异曲同工,同样是不处理异常,将其再次向外传递。

 

这时候就需要考虑对异常处理进行重构。我们先定义一个未处理的异常类。

/**
 * 
 * @author Chris Mao(Zibing)
 *
 */
public class UnhandledException extends Exception {
	
	private Exception exception;
	
	private String message;

	/**
	 * 
	 */
	private static final long serialVersionUID = 3490319235806360289L;
	
	public UnhandledException(Exception e, String message) {
		this.exception = e;
		this.message = message;
	}

	public Exception getException() {
		return exception;
	}

	public String getMessage() {
		return message;
	}
}

然后再将文章一开始提到的代码改为如下。

public void writeFile(String fileName, String data) throws UnhandledException  {
	FileWriter writer = null;
	try {
		writer = new FileWriter(fileName);
		writer.write(data);
	} catch (IOException e) {
		throw new UnhandledException(e, "这个异常日后再说,先让业务功能跑起来");
	}
}

这样既可以达到快速开发的要求,又可以确保日后不会忘记对这个异常的处理。

 

分享到:
评论

相关推荐

    基于小波-支持向量机的工业取水异常数据挖掘与重构.pdf

    这一策略是一种高效的数据异常处理流程,其中“粗筛选”指的是对数据进行初步的清洗和筛选,去除明显的异常值;“精识别”则是指采用更加精细化的算法对数据中的异常值进行准确识别;而“再重构”是指在识别出异常值...

    异常处理的de设she计ji与yu重chong构gou

    本文将深入探讨异常处理的设计原则、常见的异常模型、重构策略以及最佳实践。 首先,异常处理设计的核心目标是使程序能够优雅地处理错误,而不是简单地崩溃。当程序运行时遇到不可预见的问题,如资源不足、数据错误...

    异常处理的陋习

    比如,网络连接错误与输入验证错误应该有不同的处理策略。 3. **掩盖问题**:通用的异常处理可能导致真正的问题被忽略,因为它们被同一个处理逻辑覆盖了。这使得程序在运行时可能表现出不一致的行为,难以追踪和...

    java代码重构经验总结

    ### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不...通过遵循重构原则、掌握重构技巧、识别并消除代码“坏味道”,以及采用合理的异常处理策略,可以显著提升软件的稳定性和可维护性。

    重构中错误代码

    重构时,应确保异常处理机制既能够捕获错误,又能提供足够的错误信息,同时避免使用异常来控制程序流程。 总的来说,重构中的错误代码问题涉及了设计原则、代码结构、耦合度、抽象层次等多个方面。通过持续的代码...

    [免费高清PDF]31天重构系列笔记.rar

    此外,还可能讨论了异常处理和单元测试在重构过程中的作用,确保代码的健壮性。 15-21天,笔记可能深入到C#中的高级重构技术,如重构面向过程代码为面向对象代码,使用 LINQ 来简化数据操作,以及如何通过依赖注入...

    易语言API设置异常处理源码.rar

    易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛,使得更多非专业...通过分析和实践,开发者不仅可以提升编程能力,还能了解和掌握易语言程序的异常处理策略,提高程序的稳定性和可靠性。

    java重构设计java重构设计.doc

    4. **平衡重构与日常任务**:日常任务优先,重构工作应在完成其他任务后继续,不可以重构为借口回避工作。 5. **文档记录**:重构经验应形成文档,并在后续工作中持续更新,每当添加功能、修复 Bug 或审查代码时,...

    一本介绍如何将现有的 Java 代码重构为 Kotlin 代码的书籍

    - **重构策略的选择**:根据项目的实际情况选择合适的重构策略。 - **测试驱动开发**:强调在重构过程中保持测试的重要性。 - **代码审查与团队协作**:介绍如何通过代码审查和团队成员之间的协作来确保重构质量。 ...

    镶金玫瑰Gilded Rose重构后项目

    此外,Java的异常处理、集合框架、泛型等特性也在项目中发挥着重要作用,确保代码的健壮性和灵活性。 再者,**重构**是提升代码质量的重要手段。重构是在不改变软件外部行为的前提下,改善其内部结构,使其更易理解...

    基于FPGA和DSP的星载软件动态重构设计.pdf

    与采用反熔丝型FPGA进行指令解析和控制的传统方案相比,本文提出的方案在硬件实现上更为简单,功能重构更为灵活。反熔丝型FPGA一旦编程完毕,其功能便无法更改,而SRAM型FPGA则可以通过重新配置来实现功能的重构和...

    基于分布式压缩感知的无线传感器网络异常数据处理.pdf

    由于传感器可能因故障或环境突变导致采集数据异常,传统的单一数据处理方法无法有效处理这类异常数据。 【异常数据模型】文中提出了两类异常数据模型,这是针对传感器网络中可能出现的不同类型的异常情况。这些模型...

    31天重构速成

    - **应用场景**:当异常处理过于频繁时。 - **步骤**:识别异常触发条件,用条件判断替代异常抛出。 19. **提取工厂类(Extract Factory Class)** - **概述**:创建一个专门负责实例化对象的工厂类。 - **应用...

    C#代码重构31法

    16. **使用条件判断代替异常**:避免在正常流程中使用异常,而是使用条件判断处理错误情况,提高程序的效率。 17. **提取工厂类**:使用工厂类来创建对象,使对象的创建过程与使用对象的代码解耦。 18. **提取子类...

    网络游戏-无线传感网络的异常处理方法及设备.zip

    这篇资料——“网络游戏-无线传感网络的异常处理方法及设备”深入探讨了如何在游戏环境中有效地管理和应对WSN的异常情况,确保网络的稳定性和玩家体验。 首先,我们要理解无线传感网络的基本概念。WSN是由大量微型...

    一个未能解决的异常

    - **区分异常类型**:对不同类型的异常采取不同的处理策略。 - **异常重试机制**:对于某些可恢复的异常,可以通过重试来解决。 - **资源管理**:确保在异常发生时,所有打开的资源都能够被正确关闭。 - **文档记录*...

    基于GAN的时间序列异常检测1

    通过在多个数据集上对比测试这些策略,并与8种基线异常检测方法进行比较,TadGAN在大多数情况下(11个数据集中6个)表现出优越的性能,尤其是在所有数据集上的平均F1分数上达到最高。 开放源代码的TadGAN不仅展示了...

    31天重构指南--代码重构(refactoring)

    2. **异常处理:** 在 `RemoveOrderLine` 方法中,可以添加更详细的异常处理逻辑,确保在找不到订单行时能够给出明确的提示。 3. **优化查找操作:** 在查找订单行时,可以考虑使用更高效的方法,如 LINQ 查询或其他...

Global site tag (gtag.js) - Google Analytics