代码洁癖系列(六):处理错误
程序运行过程中,有些错误是不可避免的,而如何使程序在出现错误时代码仍然正常工作就成了程序员的日常工作之一。那么处理错误和代码整洁有什么关系呢?
前面我们提到过,try-catch代码块会破坏代码的结构。但是,我们在处理错误时又不得不使用try-catch代码块,这样才能让我们的程序保持健壮。那么如何兼顾整洁和健壮呢,这就是我们今天要讨论的内容。
不要使用返回码
在上古时期,很多语言还都不支持异常,程序员们只能约定好返回的错误码,通过不同的错误码对代码进行错误处理。这么做需要调用者在调用方法后马上判断返回值来决定是否需要处理错误。而这一步骤往往被遗忘,就会导致程序出现不可预估的问题。所以,现在我们有了throw和try-catch这样的“热武器”,就不要再用错误码这样的“冷兵器”了。不然很容易就会被别人给秒杀的。
try-catch-finally相信大家都很熟悉,不熟悉的话,可以前往本站达成合作的各大搜索引擎进行搜索,保证有答案。
异常抛出的层级
我们不希望程序中充满了try-catch代码块,这样会使程序的可读性变差。因此,我们要适当的使用throw语句,将异常抛出。交给上一层去处理。但是,如果只由最顶层的代码去处理异常,整个程序看上去是会整洁一些,但当我们需要修改某个底层代码抛出的异常时会发生什么呢?我们需要找到往上抛的每一个方法去修改它的签名,抛出新的异常,并重新发布。这会使我们的工作量增加好几倍。所以,我们的异常最好在本层进行统一处理,或者在抛出后的上一层就进行处理。
说明发生异常的环境
在Java中,系统异常通常会给出调用栈,便于我们进行问题的定位和调试。对于我们自己抛出的异常,也应该给出异常发生的环境,例如列出调用栈,给出请求参数等等。
远离null值
我们在读、写代码时,一定有被好多层的空指针判断折磨的经历。一不小心漏掉一个判断,那么程序就会出现空指针异常,这个异常要么被上层的catch捕获,要么直接抛出。很明显,这两种结果都不是我们想要的。怎么远离空指针异常呢?
首先,代码的返回值不要返回null。可以选择直接抛出一个异常,或者返回一个特定的值,比如空对象等。
其次,代码调用时,参数不要传null,因为一旦传null,那么在方法体中就需要对这个参数进行非空判断。而目前还没有什么好的方法可以简单高效的处理参数外部传来的null,只能使用if判断。因此希望大家在调用别的方法时尽量不要传入null。
小结
本文的主要目的是使我们的代码兼顾整洁性和健壮性。这就需要我们将错误处理独立于主逻辑之外,使错误就可以被单独处理,不但能够增强可读性,还能增强可维护性。最后得到的就是我们希望看到的整洁而健壮的代码。
如果觉得文章不错的话,欢迎关注我的微信公众号:代码洁癖患者。
代码洁癖系列(六):处理错误相关推荐
- 代码洁癖系列(八):迭代的原则
我们都知道,一个软件的维护成本往往要高于其研发成本.在维护过程中,我们的代码需要不断的进行迭代.迭代的目的有两个:修复bug和增加新特性.但是迭代也会带来一系列新的问题,比如新的bug,或者是破坏代码 ...
- 代码洁癖系列(五):外在的格式美
我们在阅读一些优秀项目的源码时,一定会感叹他们代码的整洁和一致性.而作为第一印象,代码格式的整齐是让人能够继续阅读下去的动力.今天我们分别从垂直格式和横向格式两个方面来讨论代码的格式.修正格式的方法有 ...
- 代码洁癖系列(一):什么是整洁代码
作为一个代码洁癖患者,我最大的愿望就是世界和平--对不起,拿错剧本了,最大的愿望就是将对代码的洁癖传播给每一个人,净化所有的代码.这是一个宏大的愿望,但我会一直努力净化我所看到的每一行代码,并且希望能 ...
- 代码洁癖系列(三):整洁的类和函数
前面我们讨论了什么样的命名更能够让你赏心悦目,今天来讨论一下面向对象编程过程中最重要的环节,编写类和函数.我们仍然用Java来演示,什么样的类和函数才算是整洁的. 首先讨论函数,函数定义好了,类也就容 ...
- 代码洁癖系列(七):单元测试的地位
在许多程序员眼中,单元测试似乎是可有可无的,觉得这应该是测试人员的工作.实际上,测试代码和生成代码同样重要.我们不但需要测试代码,而且需要的是整洁的测试代码. 测试为什么要整洁 我们对待测试代码需要像 ...
- 代码洁癖系列(四):可忽略的注
刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...
- 代码洁癖系列(四):可忽略的注释
刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...
- 代码洁癖系列(二):命名的艺术
不知道大家还记不记得<家有儿女>里有这么一段经典台词:"我叫夏雪","我叫夏雨","我叫夏冰雹". 刘星自己给自己起的名字承包了 ...
- 代码洁癖症的我,学习 Lint 学到心态爆炸
本文由 GitCode8 授权投稿 原文链接:https://juejin.im/post/5d307615f265da1b6b1d0dd9 前言 以前对下面的问题,我的态度是,不报错就是没问题,报错 ...
最新文章
- Cognos 云最佳实践: 调整架构提供性能和可伸缩性
- 为什么我的索尼电视显示服务器异常,索尼液晶电视有哪些故障 索尼电视故障代码大全【详解】...
- Ideal配置Struts项目提示Cannot resolve symbol 'xx.jsp',以及没有找到Namespace为/的指定Action的解决
- 更改VMware硬盘大小
- 关于第十届省赛失败的总结
- java连接sybase的pom_SpringBoot下多数据源连接Sybase数据库
- 周杰伦 青花瓷 蒲公英的约定 我不配 彩虹 歌词和下载
- java概述及我的第一个java项目
- 我win10下载红警-尤里复仇黑屏,能运行,下载这个好了
- 写给那些常年战痘的痘友们~~~
- Flutter 图片组件Image、本地图片、远程图片、图片剪切、圆形图片
- UEFI引导+GPT分区模式如何安装win10原版镜像或ghost版
- Kotlin - 改良迭代器模式
- 05- 防火墙用户管理
- DeprecationWarning: currentThread() is deprecated, use current_thread() instead
- 正在准备面试?一线互联网大厂面试真题系统收录!成功入职腾讯
- 使用canvas绘制一个动态的表盘
- 以图搜图服务快速搭建
- php网站重复安装,LInux下PHP安装
- 信贷全生命周期监控报表开发
热门文章
- java格林威治时间_JAVA 花样化格林威治时间(Wed Aug 01 00:00:00 CST 2012)花样转换...
- ArcGIS Pro 2.7 新特性(部分)
- android在线4G是什么意思,android移动4g 什么意思
- 【计算机操作系统】测试题:动态分区内存分配;调页系统;分页存储管理;快表是什么?计算指令操作数地址;有效存储访问时间,缺页次数,缺页率;
- Leetcode最短的桥
- PHP项目用xhprof性能分析(安装及应用实例)
- Android6.0通过WiFi名称密码连接WiFi的方案
- discuz 手机版伪静态
- 阿里云轻量应用服务器+WordPress搭建博客记录
- Ubuntu 网络配置方法汇总