设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?

抛出异常对象
返回空对象
返回NULL值
返回错误码
函数出错返回数据类型

该思维导图由 AI 生成,仅供参考

我们可以把函数的运行结果分为两类。一类是预期的结果,也就是函数在正常情况下输出的结果。一类是非预期的结果,也就是函数在异常(或叫出错)情况下输出的结果。比如,在上一节课中,获取本机名的函数,在正常情况下,函数返回字符串格式的本机名;在异常情况下,获取本机名失败,函数返回 UnknownHostException 异常对象。
在正常情况下,函数返回数据的类型非常明确,但是,在异常情况下,函数返回的数据类型却非常灵活,有多种选择。除了刚刚提到的类似 UnknownHostException 这样的异常对象之外,函数在异常情况下还可以返回错误码、NULL 值、特殊值(比如 -1)、空对象(比如空字符串、空集合)等。
每一种异常返回数据类型,都有各自的特点和适用场景。但有的时候,在异常情况下,函数到底该返回什么样的数据类型,并不那么容易判断。比如,上节课中,在本机名获取失败的时候,ID 生成器的 generate() 函数应该返回什么呢?是异常?空字符?还是 NULL 值?又或者是其他特殊值(比如 null-15293834874-fd3A9KBn,null 表示本机名未获取到)呢?
函数是代码的一个非常重要的编写单元,而函数的异常处理,又是我们在编写函数的时候,时刻都要考虑的。所以,今天我们就聊一聊,如何设计函数在异常情况下的返回数据类型。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了函数异常处理的各种情况和处理方式,为程序员提供了丰富的理论知识和实际指导。文章首先讨论了函数出错返回数据类型,包括错误码、NULL值、空对象和异常对象,并对它们的优缺点进行了详细分析。在此基础上,介绍了空对象设计模式和抛出异常对象的方式,以及在不同编程语言中选择抛出受检异常还是非受检异常的建议。此外,文章还总结了处理函数抛出的异常的三种处理方法。通过本文,读者可以了解到不同的异常处理方式及其适用场景,以及如何在设计函数时处理异常情况。整体而言,本文内容丰富,涵盖了函数异常处理的理论知识和实际应用,对于程序员在设计函数时如何处理异常情况提供了有益的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(63)

  • 最新
  • 精选
  • Promise°
    大家好,第一次发言。有个疑问:各位在Service层返回的是对象还是Result接口

    作者回复: bo对象

    2020-08-10
    2
    9
  • sunnywhy
    第二种返回Null的情况,可以使用Optional吗

    作者回复: 可以,Java8的语法,因为有些朋友不熟悉java语言,所以高级语法我就没讲了

    2020-01-24
    4
    6
  • 张三丰
    这句话不太理解,即便是可恢复的异常依然是向上抛更合理,比如提现金额大于余额就应该告知用户啊。实在想不明白受检查异常的用武之地在哪? 对于代码 bug(比如数组越界)以及不可恢复异常(比如数据库连接失败),即便我们捕获了,也做不了太多事情,所以,我们倾向于使用非受检异常。对于可恢复异常、业务异常,比如提现金额大于余额的异常,我们更倾向于使用受检异常,明确告知调用者需要捕获处理。

    作者回复: 受检异常能明确告知用户处理啊,不是说了吗?😂 如果用户不处理受检异常,代码编译不通过的。

    2020-06-09
    3
  • 微思
    Happy new year! 鼠年大吉🎊🎈🎉🍾️🎆🧧

    作者回复: 新年快乐~

    2020-01-25
    3
  • 皮卡皮卡
    返回空对象章节中,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-24
    111
  • 辣么大
    1、不抛。返回null-123123784378-aldjf780。从功能上讲,函数是生成logtraceid,用于给记录加id,便于查找日志。返回null不影响定位问题,同时程序不会蹦。 2、上抛,到generate中处理。 3、返回空串 4、返回空串
    2020-01-25
    1
    24
  • aoe
    Go语言函数返回的时候分正确值、错误值,比较简单
    2020-02-18
    21
  • 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-27
    10
  • 大雁小鱼
    我的领导告诉我,代码稳定是第一位的,如果线上代码没有出错,即便代码写得很烂,都是不允许去修改的,一个标点一个符号都不能修改,更别说小步重构了。所以可以理解为什么有的公司代码永远都是4、5年前的样子,不去动它了。
    2020-09-10
    4
    4
收起评论
显示
设置
留言
63
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部