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

12 | 程序中的错误处理:异步编程以及我的最佳实践

异常处理
合并两个异步函数的结果
链式处理
async/await语法糖
示例代码
示例代码
CompletableFuture类
pipeline
Promise模式
Callback Hell问题
示例代码
Go语言的Promise
Java异步编程的Promise模式
JavaScript异步编程的错误处理
对于分布式的系统,推荐使用APM相关的软件
对于异步的方式,推荐使用Promise模式处理错误
为你的错误定义提供清楚的文档以及每种错误的代码示例
不要把大量的代码都放在一个try语句块内
不推荐在循环体里处理错误
处理错误时,总是要清理已分配的资源
向上尽可能地返回原始的错误
尽可能在错误发生的地方处理错误
对于同类的错误处理,用一样的模式
不要用错误处理逻辑来处理业务逻辑
对于同一个地方不停的报错,最好不要都打到日志里
忽略错误最好有日志
错误日志的输出最好使用错误码
定义错误的严重程度
同类错误的定义可扩展
统一分类的错误字典
callback方式
无法使用抛异常的方式
无法使用返回码
错误处理的最佳实践
异步编程世界里的错误处理方法
程序中的错误处理

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

你好,我是陈皓,网名左耳朵耗子。
上节课中,我们讨论了错误返回码和异常捕捉,以及在不同情况下该如何选择和使用。这节课会接着讲两个有趣的话题:异步编程世界里的错误处理方法,以及我在实战中总结出来的错误处理最佳实践。

异步编程世界里的错误处理

在异步编程的世界里,因为被调用的函数是被放到了另外一个线程里运行,这将导致:
无法使用返回码。因为函数在“被”异步运行中,所谓的返回只是把处理权交给下一条指令,而不是把函数运行完的结果返回。所以,函数返回的语义完全变了,返回码也没有用了
无法使用抛异常的方式。因为除了上述的函数立马返回的原因之外,抛出的异常也在另外一个线程中,不同线程中的栈是完全不一样的,所以主线程的 catch 完全看不到另外一个线程中的异常。
对此,在异步编程的世界里,我们也会有好几种处理错误的方法,最常用的就是 callback 方式。在做异步请求的时候,注册几个 OnSuccess()OnFailure() 这样的函数,让在另一个线程中运行的异步代码回调过来。

JavaScript 异步编程的错误处理

比如,下面这个 JavaScript 示例:
function successCallback(result) {
console.log("It succeeded with " + result);
}
function failureCallback(error) {
console.log("It failed with " + error);
}
doSomething(successCallback, failureCallback);
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

异步编程中的错误处理是一个重要的话题,本文从JavaScript和Java两个角度探讨了异步编程中的错误处理方法。在异步编程中,无法使用传统的返回码和异常捕捉方式,因此需要采用其他方法来处理错误。文章首先介绍了JavaScript中的错误处理方式,包括使用回调函数、Promise模式以及ECMAScript 2017标准中的async/await关键字。通过示例代码,展示了这些方法的使用和优势。接着,文章转向Java中的异步编程,介绍了CompletableFuture类的使用,包括链式处理、合并异步函数结果以及异常处理。通过对比JavaScript和Java的异步编程错误处理方法,读者可以全面了解在不同语言环境下的最佳实践。文章还提到了函数式编程中的pipeline方法以及在ECMAScript 2017中的async/await语法糖,为读者提供了更多的思路和选择。总之,本文通过深入浅出的方式,全面介绍了异步编程中的错误处理方法,对于正在学习或使用异步编程的开发者具有很高的参考价值。此外,文章还总结了一些错误处理的最佳实践,包括统一分类的错误字典、定义错误的严重程度、错误日志的输出最好使用错误码等,为读者提供了一些实用的建议。文章还介绍了Go语言中的Promise模式的实现方式,并提供了一些错误处理的最佳实践,为读者提供了更多的思路和选择。

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

全部留言(53)

  • 最新
  • 精选
  • 云学
    语言大神,能否总结下您接触的各种语言的特色和缺陷,比如该语言的最佳适用场景,吐槽下该语言不好的地方,比如c++的RAII,javascript的promise就是他们的特色

    作者回复: 吐槽,可以啊。过两天写一篇

    2018-01-13
    5
  • 杜小琨
    向上尽可能地返回原始的错误。如果一定要把错误返回到更高层去处理,那么,应该返回原始的错误,而不是重新发明一个错误。 这一条如果要作为通用规则我觉得略有争议。我的观点是错误(异常)同样要考虑封装性。 需要考虑到这个错误原因是否应该上层感知。比如在在存储一张图片时,上层进行抽象业务逻辑的单元并不期望知道底层具体存储方式的存在,你用本地磁盘也好,hdfs也罢,这些原始错误暴露到业务流程中反而会让业务茫然不知所措。其实上层业务只需要知道错误发生(图片保存失败)即可,并不关心具体错误的原因。
    2017-12-15
    9
    104
  • 何小事儿
    老师,如何解决技术团队因需求不断,业务开发繁忙而导致的技术水平没有显著提高机会的问题?
    2017-11-13
    4
    28
  • 起司猫
    很喜欢这种方式去分析问题,我都是单从java的角度去看待对于一个问题的处理。耗子叔的文章都是从不同语言的处理方式,然后得出一个稍微通用的解决,或者给出不同处理方式的优劣。看来有时间的确应该多学几门不同的语言,看问题的视野完全不一样啊☺️☺️为了看懂go的代码,我还特地去简单看了下go的语法。貌似耗子叔很喜欢go(⊙o⊙)哇哈哈哈
    2017-11-12
    27
  • 像喜欢春天的熊一样喜欢你
    错误处理方式 1、统一分类的错误字典 2、同类错误的定义最好是可以扩展的 3、定义错误的严重程度。 4、错误日志的输出最好使用错误码,而不是错误信息 5、处理错误时,总是要清理已分配的资源 6、向上尽可能地返回原始的错误 7、忽略错误最好有日志 8、对于同一个地方不停的报错,最好不要都打到日志里 9、不要用错误处理逻辑来处理业务逻辑 10、对于同类的错误处理,用一样的模式 11、尽可能在错误发生的地方处理错误 12、向上尽可能地返回原始的错误 13、处理错误时,总是要清理已分配的资源 14、不推荐在循环体里处理错误 15、不要把大量的代码都放在一个 try 语句块内 16、为你的错误定义提供清楚的文档以及每种错误的代码示例 17、对于异步的方式,推荐使用 Promise 模式处理错误 18、对于分布式的系统,推荐使用 APM 相关的软件
    2020-04-27
    1
    15
  • 莫名的冲动
    耗子叔,挺喜欢你的文章,篇篇都是经验之谈,而且面向的受众技术人员也是最广的,既不是那种网上一搜就能找到的技术罗列,也不是普通技术人员平常都难遇到的高深技术问题解析,角度和深度都刚刚好!赞!
    2017-11-10
    12
  • 左耳朵
    @ 何小事儿 后面的《时间管理》会有一些,敬请关注
    2017-11-21
    10
  • aiueo
    一个强大的系统,一定要有一套日志规范和处理错误机制。
    2019-12-20
    6
  • 陈威严
    BUG:左右滑动代码块时,文章有时会退出详情页,进到文章列表页
    2019-02-02
    6
  • 爱学习的大叔
    我们用的splunk和newrelic来监控,然后记录完整错误日志,再借助于splunk很方便
    2020-01-26
    4
收起评论
显示
设置
留言
53
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部