程序运行时异常可分为受检异常和非受检异常;
非受检异常可捕获也可以不捕获,一般用于就算捕获了也于事无补的情况,此时使得程序出错而结束。比如解析一段外部服务传递消息,此时消息格式出错,直接出现异常结束就行,无需使用try/catch和throws
受检异常为要捕获的异常。用于捕获这个异常后,在接下的某个阶段操作中能处理这个异常,或上层调用方需要感知这个异常
对于方法/函数抛出的异常有三种处理方案
1,吞掉,即为直接try/catch处理,用于调用方(上层)并不关心此异常
2,将 抛出的异常re-throw,调用方关心此异常,有一定的业务关联
3,将 抛出的异常重新包装后再re-throw,调用方关心这个异常但直接re-throw的话缺少背景,不能直接理解这个异常
总之,是否往上继续抛出,要看上层代码是否关心这个异常。关心就将它抛出,否则就直接吞掉。是否需要包装成新的异常抛出,看上层代码是否能理解这个异常、是否业务相关。
受检异常的缺点:
1,受检异常需要显式地在函数定义中声明。那函数的定义就会非常冗长,这就会影响代码的可读性,
2,编译器强制我们必须显示地捕获所有的受检异常,代码实现会比较繁琐。
3,受检异常的使用违反开闭原则。如果我们给某个函数新增一个受检异常,这个函数所在的函数调用链上的所有位于其之上的函数都需要做相应的代码修改,直到调用链中的某个函数将这个新增的异常 try-catch 处理掉为止。而新增非受检异常可以不改动调用链上的代码。我们可以灵活地选择在某个函数中集中处理,比如在 Spring 中的 AOP 切面中集中处理异常。
非受检异常的缺点:
1,非受检异常不需要显式地在函数定义中声明,那我们在使用函数的时候,就需要查看代码才能知道具体会抛出哪些异常。
2,非受检异常不需要强制捕获处理,那程序员就有可能漏掉一些本应该捕获处理的异常。
3,非受检异常对业务没受检异常那么贴切
函数出错选择返回null,返回空对象还是异常?
1,这个数据为null/空对象正不正常,不正常时抛出异常
例如:对于以 get、find、select、search、query 等单词开头的查找函数来说,数据不存在,并非一种异常情况,这是一种正常行为。所以,返回代表不存在语义的 NULL 值比返回异常更加合理。
2,若是明确表明没有数据可用则返回null,调用方若出现空指针异常属于非受检异常
3,返回值是null还是空对象取决于数据不存在时在业务上对下一步骤的影响,没有绝对孰优孰略之分
4,当返回值为0,-1,空对象的时候,最好在方法的注释给予返回值说明











网友评论