首页 > 其他分享 >《代码整洁之道》第 7 章 错误处理

《代码整洁之道》第 7 章 错误处理

时间:2023-08-02 16:26:16浏览次数:30  
标签:try handle ... 代码 之道 catch 错误处理 异常 整洁

第 7 章 错误处理

7.1 使用异常而非返回码

在很久以前,许多语言都不支持异常。这些语言处理和汇报错误的手段都有限。你要么设
置一个错误标识,要么返回给调用者检查的错误码。代码清单7-1中的代码展示了这些手段。

// 代码清单7-1 DeviceContollerjava
public class DeviceController {
 	... 
  public void sendShutDown{) {
    DeviceHandle handle = getHandle(DEV1);
    // Check the state of the device
    if (handle != DeviceHandle.INVALID) {
    	// Save the device status to the record field
    	retrieveDeviceRecord(handle);
      // If not suspended, shut down
      if (record.getStatus() != DEVICE_SUSPENDED) {
      	pauseDevice(handle) ;
      	clearDeviceWorkQteue(handle) ;
      	closeDevice(handle) ;
      } else {
      	logger.log ("Device suspended. Unable to shut down") ;
      }
    } else {
      logger.log ("Invalid handle for: " + DEV1.toString());
    }
   }
	...    
}

这类手段的问题在于,它们搞乱了调用者代码。调用者必须在调用之后即刻检查错误。不幸的是,这个步骤很容易被遗忘。所以,遇到错误时,最好抛出一个异常。调用代码很整洁,其逻辑不会被错误处理搞乱。
代码清单 7-2 展示了在方法中遇到错误时抛出异常的情形。

// 代码清单7-2 DeviceController.java (采用异常处理)
public class DeviceController {
  ...
  public void sendShutDown() {
    try {
      tryToShutDown();
    } catch (DeviceShutDownError e) {
      logger.log(e);
    }
	}
  
  private void tryToShutDown() throws Devi ceShut DownError {
    DeviceHandle handle = getHandle(DEV1);
    DeviceRecord record = retrieveDeviceRecord(handle);
    pauseDevice(handle);
    clearDeviceWorkQueue(handle);
    closeDevice(handle);
	}
  
  private DeviceHandle getHandle (DeviceID id) {
    ...
    throw new DeviceShutDownError ("Invalid handle for: " + id. toString()) ;
    ...
  }
  ...
}

注意这段代码整洁了很多。这不仅关乎美观。这段代码更好,因为之前纠结的两个元素设备关闭算法和错误处理现在被隔离了。你可以查看其中任一元素,分别理解它。

7.2 先写 Try-Catch-Finally 语句

异常的妙处之- -是,它们在程序中定义了一个范围。执行 try-catch-finally 语句中 try 部分的代码时,你是在表明可随时取消执行,并在 catch 语句中接续。
在某种意义上,try 代码块就像是事务。catch 代码块将程序维持在一种持续状态, 无论 try 代码块中发生了什么均如此。所以,在编写可能抛出异常的代码时,最好先写出 try-catch-finally 语句。这能帮你定义代码的用户应该期待什么,无论 try 代码块中执行的代码出什么错一样。

7.4 给出异常发生的环境说明

你抛出的每个异常,都应当提供足够的环境说明,以便判断错误的来源和处所。在 Java 中,你可以从任何异常里得到堆栈踪迹(stack trace);然而,堆栈踪迹却无法告诉你该失败操作的初衷。
应创建信息充分的错误消息,并和异常一起传递出去。在消息中,包括失败的操作和失败类型。如果你的应用程序有日志系统,传递足够的信息给 catch 块,并记录下来。

7.5 依调用者需要定义异常类

对错误分类有很多方式。可以依其来源分类:是来自组件还是其他地方?或依其类型分
类:是设备错误、网络错误还是编程错误?不过,当我们在应用程序中定义异常类时,最重
要的考虑应该是它们如何被捕获。
来看一个不太好的异常分类例子。下面的try-catch-finally语句是对某个第三方代码库的
调用。它覆盖了该调用可能抛出的所有异常:

ACMEPort port = new ACMEPort(12) ;

try {
	port.open() ;
} catch (DeviceResponseException e) {
	reportPortError(e) ;
	logger.log("Device response exception", e);
} catch (ATM1212UnlockedException e) {
	reportPortError(e) ;
	logger.log("Unlock exception", e);
} catch (GMXError e) {
	reportPortError(e);
	logger.log("Device response exception") ;
} finally {
	...
}

语句包含了一大堆重复代码,这并不出奇。在大多数异常处理中,不管真实原因如何,我们总是做相对标准的处理。我们得记录错误,确保能继续工作。

7.7 别返回 null 值

这种代码看似不坏,其实糟透了!返回 null 值,基本上是在给自己增加工作量,也是在给调用者添乱。只要有一处没检查 null 值,应用程序就会失控。

对于从应用程序深处抛出的 NullPointerException 异常,你到底该作何反应呢?

7.8 别传递 null 值

在大多数编程语言中,没有良好的方法能对付由调用者意外传入的 null 值。事已如此, 恰当的做法就是禁止传入 null 值。这样,你在编码的时候,就会时时记住参数列表中的 null 值意味着出问题了,从而大量避免这种无心之失。

标签:try,handle,...,代码,之道,catch,错误处理,异常,整洁
From: https://www.cnblogs.com/Sherry4869/p/17600960.html

相关文章

  • 《代码整洁之道》第 5 章 格式
    第5章格式5.2垂直格式Junit、FitNesse和TimeandMoney由相对较小的文件组成。没有一个超过500行,多数都小于200行。Tomcat和Ant则有些文件达到数千行,将近一半文件长于200行。对我们来说,这意味着什么?意味着有可能用大多数为200行、最长500行的单个文件构造......
  • 《代码整洁之道》第 4 章 注释
    第4章注释4.1注释不能美化糟糕的代码带有少量注释的整洁而有表达力的代码,要比带有大量注释的零碎而复杂的代码像样得多。与其花时间编写解释你搞出的糟糕的代码的注释,不如花时间清洁那堆糟糕的代码。4.2用代码来阐述只要想上那么几秒钟,就能用代码解释你大部分的意图。很......
  • PPT| IT售前工程师修炼之道P79
    PPT共79页,由于篇幅有限,以下为部分资料,需要PPT资料的朋友可以关注我,私信我。......
  • 【go语言】2.3.1 错误处理的基本概念
    在Go语言中,错误处理是通过返回错误值进行的,而不是像一些其他语言那样通过抛出和捕获异常。Go语言有一个内置的接口类型 error,专门用于处理错误。error 接口error 是一个内置的接口,定义如下:typeerrorinterface{Error()string}任何实现了 Error()string 方......
  • 数字化时代,企业研发效能跃升之道丨IDCF
    本文节选自新书《数字化时代研发效能跃升方法与实践》作者:冬哥研发效能是近年的热词,企业言必谈效能,但究竟什么是研发效能,落地具体应该如何进行,相信每个人都会有无数的问题浮现。什么是效能?效能指的是个人、组织或系统在完成任务或达成目标时,所展现的能力和效率。具体而言,效能是指所......
  • php错误处理
    1、介绍在PHP中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。有三种不同的处理方法:die函数自定义错误和错误触发器错误报告2、die函数die()函数输出一条消息,并退出当前脚本。die(status)如果 status 是字符......
  • 云之道知识付费v2 3.1.1独立版小程序源码+教程
    我已经对源码中的所有引流部分进行了修改,如果还有任何未被删除的部分,请麻烦您留言告诉我!请注意,本源码仅供学习使用,请在下载后的24小时内将其删除。因此,目前我了解的情况是,它不支持通过观看广告来获取资源。如果有大佬在搭建后发现它支持该功能,请务必告诉我操作步骤!我在此向你们表......
  • 《代码整洁之道》第 3 章 函数
    第3章函数3.1短小函数的第一规则是短小。函数不该有100行那么长,20行封顶最佳。……每个函数都只有两行、三行或四行长。每个函数都一目了然。每个函数都只说一件事。而且,每个函数都依序把你带到下一个函数。这就是函数应该达到的短小程度!if语句、else语句、while......
  • VTK 9.2 Qt 5.14 安装及错误处理
    安装注意:编译release和debug,通过切换配置为release和debug,文件都是在cmake的CMAKE_INSTALL_PREFIX指定的文件夹,需要编译完一种后,把这个文件夹改名(比如debug配置,则改名为debug),不然会覆盖。在Qt项目中,出现错误:“无法解析的外部符号__imp_gl***”,“项目-属性-链接器-输入”添加:OpenG......
  • 《代码整洁之道》第 2 章 有意义的命名
    第2章有意义的命名2.2名副其实如果名称需要注释来补充,那就不算是名副其实。publicList<int[]>getThem(){ List<int[]>list1=newArrayList<int[]>(); for(int[]x:theList) if(x[0]==4) list1.add(x); returnlist1;}为什么难以说明上列代码要做......