36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?
王争
该思维导图由 AI 生成,仅供参考
我们可以把函数的运行结果分为两类。一类是预期的结果,也就是函数在正常情况下输出的结果。一类是非预期的结果,也就是函数在异常(或叫出错)情况下输出的结果。比如,在上一节课中,获取本机名的函数,在正常情况下,函数返回字符串格式的本机名;在异常情况下,获取本机名失败,函数返回 UnknownHostException 异常对象。
在正常情况下,函数返回数据的类型非常明确,但是,在异常情况下,函数返回的数据类型却非常灵活,有多种选择。除了刚刚提到的类似 UnknownHostException 这样的异常对象之外,函数在异常情况下还可以返回错误码、NULL 值、特殊值(比如 -1)、空对象(比如空字符串、空集合)等。
每一种异常返回数据类型,都有各自的特点和适用场景。但有的时候,在异常情况下,函数到底该返回什么样的数据类型,并不那么容易判断。比如,上节课中,在本机名获取失败的时候,ID 生成器的 generate() 函数应该返回什么呢?是异常?空字符?还是 NULL 值?又或者是其他特殊值(比如 null-15293834874-fd3A9KBn,null 表示本机名未获取到)呢?
函数是代码的一个非常重要的编写单元,而函数的异常处理,又是我们在编写函数的时候,时刻都要考虑的。所以,今天我们就聊一聊,如何设计函数在异常情况下的返回数据类型。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了函数异常处理的各种情况和处理方式,为程序员提供了丰富的理论知识和实际指导。文章首先讨论了函数出错返回数据类型,包括错误码、NULL值、空对象和异常对象,并对它们的优缺点进行了详细分析。在此基础上,介绍了空对象设计模式和抛出异常对象的方式,以及在不同编程语言中选择抛出受检异常还是非受检异常的建议。此外,文章还总结了处理函数抛出的异常的三种处理方法。通过本文,读者可以了解到不同的异常处理方式及其适用场景,以及如何在设计函数时处理异常情况。整体而言,本文内容丰富,涵盖了函数异常处理的理论知识和实际应用,对于程序员在设计函数时如何处理异常情况提供了有益的指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》,新⼈⾸单¥98
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(63)
- 最新
- 精选
- Promise°大家好,第一次发言。有个疑问:各位在Service层返回的是对象还是Result接口
作者回复: bo对象
2020-08-1029 - sunnywhy第二种返回Null的情况,可以使用Optional吗
作者回复: 可以,Java8的语法,因为有些朋友不熟悉java语言,所以高级语法我就没讲了
2020-01-2446 - 张三丰这句话不太理解,即便是可恢复的异常依然是向上抛更合理,比如提现金额大于余额就应该告知用户啊。实在想不明白受检查异常的用武之地在哪? 对于代码 bug(比如数组越界)以及不可恢复异常(比如数据库连接失败),即便我们捕获了,也做不了太多事情,所以,我们倾向于使用非受检异常。对于可恢复异常、业务异常,比如提现金额大于余额的异常,我们更倾向于使用受检异常,明确告知调用者需要捕获处理。
作者回复: 受检异常能明确告知用户处理啊,不是说了吗?😂 如果用户不处理受检异常,代码编译不通过的。
2020-06-093 - 微思Happy new year! 鼠年大吉🎊🎈🎉🍾️🎆🧧
作者回复: 新年快乐~
2020-01-253 - 皮卡皮卡返回空对象章节中,return Collectiosn.emptyList();出现拼写错误,应该是Collections.emptyList();
作者回复: 嗯嗯 收到 我改下
2020-01-24 - Jxin回答问题 1.抛出异常,因为服务器获取不到host是一种异常情况,并且打印的异常日志不能是warm,而是err,因为该异常不会自动回复。 2.往上抛,原封不动。应该在api统一出口处处理异常,这样异常代码会比较聚合(个人习惯)。该异常描述已经很准确,且处理异常依旧在genId接口中,所以上层函数可以认识该异常,所以原封不动。(而统一出口函数,则可以抛自定义异常,以收敛api使用方的考虑范围)。 3.抛出异常,null值裁剪名称是一种异常情况。或则说,对于裁剪名称这个函数,入参不能为null。 4.返回空字符串。小于等于0说明不需要带随机后缀,这也是一个正常的业务场景。返回空字符串是为了方便调用方不用做null判断。 分歧: 1.get,find,select等dao层操作,返回null是正常业务情况,表示数据不存在。但在其应用层,数据不存在可能意味着有脏数据,数据缺失等情况,属于异常情况,需要抛出异常。所以同样是get方法,持久层返回null,业务层返回可能是异常。 2.异常流开销大,在对响应时间要求很严格的场景。放弃合理的异常处理,采用不合理的特殊返回值的方式也是合理的。所以合理的运用异常流在java也是一个选择项。在可读和性能我们需要权衡,而这两玩意经常是相驳的。 最后: 祝栏主和同学们新年快乐!2020-01-24111
- 辣么大1、不抛。返回null-123123784378-aldjf780。从功能上讲,函数是生成logtraceid,用于给记录加id,便于查找日志。返回null不影响定位问题,同时程序不会蹦。 2、上抛,到generate中处理。 3、返回空串 4、返回空串2020-01-25124
- aoeGo语言函数返回的时候分正确值、错误值,比较简单2020-02-1821
- javaadu对于今天课堂留的作业,我采用了统一的思路—能用异常解决的都用异常解决。 1.对于 generate() 函数,如果本机名获取失败,函数返回什么?这样的返回值是否合理? 答:抛出异常,这是一个无法恢复的情况,打断正常的处理流程并进入异常逻辑处理模块 2. 对于 getLastFiledOfHostName() 函数,是否应该将 UnknownHostException 异常在函数内部吞掉(try-catch 并打印日志)?还是应该将异常继续往上抛出?如果往上抛出的话,是直接把 UnknownHostException 异常原封不动地抛出,还是封装成新的异常抛出? 答:不应该内部吞掉,应该抛出到上层做统一的异常处理,这里是个单一的模块,不需要再封装 3. 对于 getLastSubstrSplittedByDot(String hostName) 函数,如果 hostName 为 NULL 或者是空字符串,这个函数应该返回什么? 答:抛出异常,异常消息是—hostName为NULL或空字符串 4. 对于 generateRandomAlphameric(int length) 函数,如果 length 小于 0 或者等于 0,这个函数应该返回什么? 答:抛出异常,异常消息是—参数不合法2020-01-2710
- 大雁小鱼我的领导告诉我,代码稳定是第一位的,如果线上代码没有出错,即便代码写得很烂,都是不允许去修改的,一个标点一个符号都不能修改,更别说小步重构了。所以可以理解为什么有的公司代码永远都是4、5年前的样子,不去动它了。2020-09-1044
收起评论