左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180928 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

11 | 程序中的错误处理:错误返回码和异常捕捉

用户的错误
程序的错误
资源的错误
异步编程中的错误处理
选择错误处理方式的原则
错误分类
异常捕捉的性能问题
异常捕捉的优势
try-catch-finally模式
Go语言的defer关键字
C++的RAII机制
goto fail模式
自定义错误处理
Go语言的多返回值
错误处理方式的问题
解决方案:strtol函数
问题:atoi函数的错误处理
错误码和errno
错误返回码 vs 异常捕捉
异常捕捉处理
资源清理
多返回值
传统的错误检查
错误处理最佳实践
异步编程中的错误处理
对于程序中的错误处理,是该用错误返回码还是异常捕捉?

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

你好,我是陈皓,网名左耳朵耗子。
今天,我们来讨论一下程序中的错误处理。也许你会觉得这个事没什么意思,处理错误的代码并不难写。但你想过没有,要把错误处理写好,并不是件容易的事情。另外,任何一个稳定的程序中都会有大量的代码在处理错误,所以说,处理错误是程序中一件比较重要的事情。这里,我会用两节课来系统地讲一下错误处理的各种方式和相关实践。

传统的错误检查

首先,我们知道,处理错误最直接的方式是通过错误码,这也是传统的方式,在过程式语言中通常都是用这样的方式处理错误的。比如 C 语言,基本上来说,其通过函数的返回值标识是否有错,然后通过全局的errno变量并配合一个 errstr 的数组来告诉你为什么出错。
为什么是这样的设计?道理很简单,除了可以共用一些错误,更重要的是这其实是一种妥协。比如:read(), write(), open() 这些函数的返回值其实是返回有业务逻辑的值。也就是说,这些函数的返回值有两种语义,一种是成功的值,比如 open() 返回的文件句柄指针 FILE* ,或是错误 NULL。这样会导致调用者并不知道是什么原因出错了,需要去检查 errno 来获得出错的原因,从而可以正确地处理错误。
一般而言,这样的错误处理方式在大多数情况下是没什么问题的。但是也有例外的情况,我们来看一下下面这个 C 语言的函数:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

错误处理在程序开发中是一个重要的话题。本文讨论了传统的错误检查方式、多返回值、以及资源清理等不同的错误处理方法。传统的错误检查方式存在一些问题,如函数的返回值和错误值混淆在一起,导致语义不清晰。一些语言通过多返回值来解决这个问题,使得函数的接口语义更加清晰,但也存在代码冗余和逻辑混乱的问题。另外,文章还介绍了资源清理方面的处理方式,比如C++的RAII机制和Go语言的defer关键字,这些方式能够更加方便地处理资源的释放,提高代码的可读性和可维护性。总的来说,不同的错误处理方式各有优缺点,读者可以根据自己的喜好和项目需求选择适合的方式。此外,文章还探讨了错误返回码与异常捕捉的使用场景和实践原则,以及在异步编程中的错误处理方式。通过本文的学习,读者可以对如何处理程序中的错误以及在不同情况下如何选择错误处理方法有了一定的认知和理解。

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

全部留言(59)

  • 最新
  • 精选
  • 精卫鸟
    隐式异常也不要显示的忽略吧,至少记录一条日志,不然会造成异常黑洞。之前帮同事找一个线上小概率问题,所有的日志和异常检测都抓不到,最后对全部进程一起strace,才发现是他catch了异常,啥都没做就return了... 我们后来揍了丫的
    2017-11-07
    6
    157
  • 左耳朵
    @ stone扎西华丹,是我给极客时间出难题了,我的好些文章里有好多代码,有的会有好些图片,有的会有好些数学公式,这类文章不但都非常难配上语音,而且可能在手机端的排版都会很有问题,难为极客时间的编辑、产品和技术了,这个还望能理解了(后面的文章这样的事你会看到很多)
    2017-11-21
    1
    55
  • majun
    期望听您对进程、线程、多进程、多线程的讲解,谢谢!
    2017-11-07
    40
  • 大石头
    “错误处理”真的是一个在实践中既简单又不简单的事情。说他简单呢,是因为,每个人在学写代码的时候都会学到一些错误处理的方法: * 检查一个系统提供给你的错误码,这种我只在 C Bash里碰到过 * 返回码,各种语言都可以 * 多返回值 go python 都可以 * try catch finally 最具代表性的Java 不论哪种处理方法,其实学习的时候都不会觉得很难理解,讲解这类问题的章节也比较短。说这事不简单是因为放到实践中问题就多了: * 资源回收。这个问题是在C语言里必须妥善处理的问题,到了C++,有了对象其实已经有了很好的解决 * 返回码是否可忽略。只要你是可以忽略的,那么人类的本性就会by default的把它忽略,不管你是系统的错误码,还是那种函数直接返回的错误码。这种在 Java 里解决的比较好,你不能隐式忽略exception的存在。 * 错误返回码 vs 异常捕捉 到底用哪个? 最后这个问题确实有争议,博主的首先观点是**“不希望发生的用异常捕捉,可能会发生的用返回码”**。但我站在业务中工程实践的角度来说有些不一样的理解。“不希望发生的事”,有的是你能处理的了的,有的是你处理不了的。对于你能处理的了的,你(不管用什么方式)能检测到并应加以处理就可以了,对于你处理不了的,你除了抛异常似乎也没什么办法了;“可能发生的”也分你能处理的了的,和你处理不了的。比如说,你自己维护了一个函数,你的调用者给你发了一串注入攻击参数(这个算可能发生的)。假如你出处理不了,那么结果可能是攻击者成功骗过你拿到了那想要的返回数据,也可能是你的程序被搞挂(你抛了异常);当然,你也可能这个攻击你能够识别,那么处理方法是你要告知调用者参数错误,你可以用返回码也可以用异常,这个事情可以取决于很多因素,比如: * 调用者的代码是你自己维护的,你想追求代码的可读性好,愿意用异常 * 你封装的函数其实是一个微服务,别人是通过HTTP来调用你的,那你只能跟调用者定义一套返回码了 * 调用者其实是UI界面的操作者,那么其实 返回码 和 异常 可以都没有,但你却要给一个UI错误提示 所以,基于以上的讨论,个人观点是, 对于你处理不了的,抛异常就好了;如果是你能处理的异常,那么要看这个异常的下游要交给谁: * 交给代码处理的,可以用异常,也可以用错误码,取决于团队文化 * 交给微服务的,只能用错误码。如果是RPC的话,可以用异常,但是调用者要能识别你抛出的异常就要经常更新异常的定义,这个在实践中很低效 * 交给用户处理的,要讲的是用户体验好。用户看不见的log你打了就可以了
    2020-02-10
    2
    29
  • xfly
    对于上面三种错误的种类来说,程序中的错误,可能用异常捕捉会比较合适;用户的错误,用返回码比较合适;而资源类的错误,要分情况,是用异常捕捉还是用返回值,要看这事是不应该出现的,还是经常出现的。 —— 这三种分类和处置方式比较赞同。 但实际在多人协作项目,或大型项目中多方技术人员要在这个层面理解达成一致不是那么容易的事情。如果依赖于解决架构负债,架构升级来优化,驱动力又似乎不足。
    2017-11-07
    1
    17
  • yun
    >异常捕捉的确是对性能有影响的,那是因为一旦异常被抛出,函数也就跟着 return 了。而程序在执行需要处理函数栈上的上下文,这会导致性能变得很慢,尤其是函数栈比较深的时候 异常抛出和不抛出,函数栈的深度应该差不多吧?函数栈的上下文会有啥不同?
    2018-03-27
    3
    9
  • LEI
    不是java的示例哦,java没有指针一说,看是能看明白意思,示例看着有点感觉自己门外汉,像是自己在学英语,然后讲解的人用另一门类似的语言在解释英语的意思一样,买课程只看了目录,作者简介写了骨灰级程序员,我以为是自己熟悉的java的讲解呢,因为自己是个半路出家的程序员,所以对c还是不太了解,今天只是选了这篇学习,不知道其他的文章是不是也都是C代码做示例讲解的哦,如果都是C的话,学起来就别扭了
    2018-12-15
    1
    6
  • 徐超军
    我们大不部分都是定义自己的异常处理类,然后各种异常都定义好错误码,返回给调用者,这样很清晰的就知道什么问题了
    2018-11-06
    5
  • 阿仁🇨🇳
    我是个零基础学员,我表示可以看完一遍,但是啥懂不懂 目前就知道以后遇到类似错误纠正的事,那我就再来这里重新查看,寻找答案。哈哈,这算是收获吗?
    2019-01-18
    4
  • 呆呆
    错误码、异常处理都是在不同场景下的结果,同步可直接获得,异步不能
    2018-11-15
    4
收起评论
显示
设置
留言
59
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部