[Clean Code] Chapter 7: 异常处理
2016-04-10 22:10
309 查看
Chapter 7 Error Handling
1-使用异常而不是返回错误码
2-提供关于错误的信息
3-为调用的需求定义异常处理类
4-定义特殊情况处理
5-不要返回NULL
6-不要传NULL除非函数要求
7-总结
当且仅当你需要抓一些异常,但想放走其他异常的时候,才使用多种异常类型处理。
最可怕的不是写判断 != NULL 很不整洁,而是我们可能忘了判断而导致运行时错误。
clean 和 robust 并不矛盾!
1-使用异常而不是返回错误码
2-提供关于错误的信息
3-为调用的需求定义异常处理类
4-定义特殊情况处理
5-不要返回NULL
6-不要传NULL除非函数要求
7-总结
Chapter 7: Error Handling
1-使用异常而不是返回错误码
之前讨论过,使用异常机制,会使得代码简洁清晰的多。2-提供关于错误的信息
3-为调用的需求定义异常处理类
对比以下代码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 { ... } VS // 假如 ACMEPort 是第三方API, 这样做可以降低与API的耦合 // 并且可以按照自己的思路设计代码的逻辑 LocalPort port = new LocalPort(12); try { port.open(); } catch (PortDeviceFailure e) { reportError(e); logger.log(e.getMessage(), e); } finally { ... } // LocalPort 类,没错,就是专门为ACME写的 public class LocalPort { private ACMEPort innerPort; public LocalPort(int portNumber) { innerPort = new ACMEPort(portNumber); } public void open() { try { innerPort.open(); } catch (DeviceResponseException e) { throw new PortDeviceFailure(e); } catch (ATM1212UnlockedException e) { throw new PortDeviceFailure(e); } catch (GMXError e) { throw new PortDeviceFailure(e); } } ... }
当且仅当你需要抓一些异常,但想放走其他异常的时候,才使用多种异常类型处理。
4-定义特殊情况处理
假如有这么一情况,在某商店,你买了书则免邮费,不买则需要付邮费10元。// try catch扰乱了代码逻辑 try { 获取书费 总消费 += 书费 } catch(没买书 e) { 总消费 += 邮费 } VS 获取书费 总消费 += 书费 // 设置特殊情况 当没买书时,"获取书费的函数返回邮费"
5-不要返回NULL!!!
假如获取员工列表// 如果返回null List<Employee> employees = getEmployees(); if (employees != null) { for(Employee e : employees) { totalPay += e.getPay(); } } // 如果不返回null,返回空list List<Employee> employees = getEmployees(); for(Employee e : employees) { totalPay += e.getPay(); }
最可怕的不是写判断 != NULL 很不整洁,而是我们可能忘了判断而导致运行时错误。
6-不要传NULL,除非函数要求!
同上,一样会出运行时错误。否则我们就要对所有函数的参数进行检验,然后对不合法的抛出异常。7-总结
独立出你的异常处理!clean 和 robust 并不矛盾!
相关文章推荐
- 【步兵 c++】试用default_random_engine
- S5PV210中的定时器
- Linux中getopt()函数用法
- 几种软负载均衡策略分析
- What is the difference between a URI, a URL and a URN
- Android实现画板功能的多种实现方式
- jvm GC收集器与内存分配策略
- [实时渲染] 2. 图形渲染管线
- 【机器学习详解】SVM解二分类,多分类,及后验概率输出
- What is the difference between a URI, a URL and a URN
- 面试题66 矩阵中的路径
- 监控 Linux Unix Solaris AIX, swap page in / swap page out
- 20145317彭垚 《Java程序设计》第一次实验实验报告
- 反转链表
- 学习笔记之linux网络属性配置及其命令用法
- 学习笔记之linux网络属性配置及其命令用法
- TCP/IP总结
- 汉堡评价
- Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)
- Redis - 安装