左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家,骨灰级程序员
立即订阅
40357 人已学习
课程目录
已完结 108 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 | 洞悉技术的本质,享受科技的乐趣
免费
01 | 程序员如何用技术变现(上)
02 | 程序员如何用技术变现(下)
03 | Equifax信息泄露始末
04 | 从Equifax信息泄露看数据安全
05 | 何为技术领导力?
06 | 如何才能拥有技术领导力?
07 | 推荐阅读:每个程序员都该知道的知识
08 | Go语言,Docker和新技术
09 | 答疑解惑:渴望、热情和选择
10 | 如何成为一个大家愿意追随的Leader?
11 | 程序中的错误处理:错误返回码和异常捕捉
12 | 程序中的错误处理:异步编程以及我的最佳实践
13 | 魔数 0x5f3759df
14 | 推荐阅读:机器学习101
15 | 时间管理:同扭曲时间的事儿抗争
16 | 时间管理:如何利用好自己的时间?
17 | 故障处理最佳实践:应对故障
18 | 故障处理最佳实践:故障改进
19 | 答疑解惑:我们应该能够识别的表象和本质
20 | Git协同工作流,你该怎么选?
21 | 分布式系统架构的冰与火
22 | 从亚马逊的实践,谈分布式系统的难点
23 | 分布式系统的技术栈
24 | 分布式系统关键技术:全栈监控
25 | 分布式系统关键技术:服务调度
26 | 分布式系统关键技术:流量与数据调度
27 | 洞悉PaaS平台的本质
28 | 推荐阅读:分布式系统架构经典资料
29 | 推荐阅读:分布式数据调度相关论文
30 | 编程范式游记(1)- 起源
31 | 编程范式游记(2)- 泛型编程
32 | 编程范式游记(3) - 类型系统和泛型的本质
33 | 编程范式游记(4)- 函数式编程
34 | 编程范式游记(5)- 修饰器模式
35 | 编程范式游记(6)- 面向对象编程
36 | 编程范式游记(7)- 基于原型的编程范式
37 | 编程范式游记(8)- Go 语言的委托模式
38 | 编程范式游记(9)- 编程的本质
39 | 编程范式游记(10)- 逻辑编程范式
40 | 编程范式游记(11)- 程序世界里的编程范式
41 | 弹力设计篇之“认识故障和弹力设计”
42 | 弹力设计篇之“隔离设计”
43 | 弹力设计篇之“异步通讯设计”
44 | 弹力设计篇之“幂等性设计”
45 | 弹力设计篇之“服务的状态”
46 | 弹力设计篇之“补偿事务”
47 | 弹力设计篇之“重试设计”
48 | 弹力设计篇之“熔断设计”
49 | 弹力设计篇之“限流设计”
50 | 弹力设计篇之“降级设计”
51 | 弹力设计篇之“弹力设计总结”
52 | 管理设计篇之“分布式锁”
53 | 管理设计篇之“配置中心”
54 | 管理设计篇之“边车模式”
55 | 管理设计篇之“服务网格”
56 | 管理设计篇之“网关模式”
57 | 管理设计篇之“部署升级策略”
58 | 性能设计篇之“缓存”
59 | 性能设计篇之“异步处理”
60 | 性能设计篇之“数据库扩展”
61 | 性能设计篇之“秒杀”
62 | 性能设计篇之“边缘计算”
63 | 区块链技术的本质
64 | 区块链技术细节:哈希算法
65 | 区块链技术细节:加密和挖矿
66 | 区块链技术细节:去中心化的共识机制
67 | 区块链技术细节:智能合约
68 | 区块链技术 - 传统金融和虚拟货币
69 | 程序员练级攻略:开篇词
70 | 程序员练级攻略:零基础启蒙
71 | 程序员练级攻略:正式入门
72 | 程序员练级攻略:程序员修养
73 | 程序员练级攻略:编程语言
74 | 程序员练级攻略:理论学科
75 | 程序员练级攻略:系统知识
76 | 程序员练级攻略:软件设计
77 | 程序员练级攻略:Linux系统、内存和网络
78 | 程序员练级攻略:异步I/O模型和Lock-Free编程
79 | 程序员练级攻略:Java底层知识
80 | 程序员练级攻略:数据库
81 | 程序员练级攻略:分布式架构入门
82 | 程序员练级攻略:分布式架构经典图书和论文
83 | 程序员练级攻略:分布式架构工程设计
84 | 程序员练级攻略:微服务
85 | 程序员练级攻略:容器化和自动化运维
86 | 程序员练级攻略:机器学习和人工智能
87 | 程序员练级攻略:前端基础和底层原理
88 | 程序员练级攻略:前端性能优化和框架
89 | 程序员练级攻略:UI/UX设计
90 | 程序员练级攻略:技术资源集散地
91 | 程序员面试攻略:面试前的准备
92 | 程序员面试攻略:面试中的技巧
93 | 程序员面试攻略:面试风格
94 | 程序员面试攻略:实力才是王中王
95 | 高效学习:端正学习态度
96 | 高效学习:源头、原理和知识地图
97 | 高效学习:深度,归纳和坚持实践
98 | 高效学习:如何学习和阅读代码
99 | 高效学习:面对枯燥和量大的知识
左耳听风
登录|注册

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

陈皓 2017-11-09
上一篇文章中,我们讨论了错误返回码和异常捕捉,以及在不同情况下该如何选择和使用。本文中会接着讲两个有趣的话题:异步编程世界里的错误处理方法,以及我在实战中总结出来的错误处理最佳实践。

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

在异步编程的世界里,因为被调用的函数是被放到了另外一个线程里运行,这将导致:
无法使用返回码。因为函数在“被”异步运行中,所谓的返回只是把处理权交给下一条指令,而不是把函数运行完的结果返回。所以,函数返回的语义完全变了,返回码也没有用了
无法使用抛异常的方式。因为除了上述的函数立马返回的原因之外,抛出的异常也在另外一个线程中,不同线程中的栈是完全不一样的,所以主线程的 catch 完全看不到另外一个线程中的异常。
对此,在异步编程的世界里,我们也会有好几种处理错误的方法,最常用的就是 callback 方式。在做异步请求的时候,注册几个 OnSuccess()OnFailure() 这样的函数,让在另一个线程中运行的异步代码来回调过来。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《左耳听风》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(25)

  • 杜小琨
    向上尽可能地返回原始的错误。如果一定要把错误返回到更高层去处理,那么,应该返回原始的错误,而不是重新发明一个错误。

    这一条如果要作为通用规则我觉得略有争议。我的观点是错误(异常)同样要考虑封装性。

    需要考虑到这个错误原因是否应该上层感知。比如在在存储一张图片时,上层进行抽象业务逻辑的单元并不期望知道底层具体存储方式的存在,你用本地磁盘也好,hdfs也罢,这些原始错误暴露到业务流程中反而会让业务茫然不知所措。其实上层业务只需要知道错误发生(图片保存失败)即可,并不关心具体错误的原因。
    2017-12-15
    1
    46
  • 何小事儿
    老师,如何解决技术团队因需求不断,业务开发繁忙而导致的技术水平没有显著提高机会的问题?
    2017-11-13
    1
    17
  • sonnyching
    很喜欢这种方式去分析问题,我都是单从java的角度去看待对于一个问题的处理。耗子叔的文章都是从不同语言的处理方式,然后得出一个稍微通用的解决,或者给出不同处理方式的优劣。看来有时间的确应该多学几门不同的语言,看问题的视野完全不一样啊☺️☺️为了看懂go的代码,我还特地去简单看了下go的语法。貌似耗子叔很喜欢go(⊙o⊙)哇哈哈哈
    2017-11-12
    13
  • 莫名的冲动
    耗子叔,挺喜欢你的文章,篇篇都是经验之谈,而且面向的受众技术人员也是最广的,既不是那种网上一搜就能找到的技术罗列,也不是普通技术人员平常都难遇到的高深技术问题解析,角度和深度都刚刚好!赞!
    2017-11-10
    5
  • 左耳朵
    @ 何小事儿 后面的《时间管理》会有一些,敬请关注
    2017-11-21
    3
  • 左耳朵
    @ Chris 哪些地方看不懂?
    2017-11-21
    2
  • 宝爷
    很好奇多个async/await异步调用的try catch怎么实现的,我能想到的就是编译器自动在多个异步的代码处补充try catch,使用同一个异常处理
    2018-06-21
    1
  • 刘強
    骨灰级程序员,名副其实啊
    2018-06-14
    1
  • 站住!我的马甲
    耗子叔,对于dubbo调用怎么能够更好的返回它的异常信息
    2018-04-11
    1
  • 浪子
    开个脑洞,对于“不要用错误处理逻辑来处理业务逻辑”这条规范,在幂等处理中的用数据库唯一性约束解决是不是恰好是反例?
    2018-04-10
    1
  • 扫地僧的功夫梦
    实现Callable接口是不是算有返回呢?
    2018-04-02
    1
  • 云学
    语言大神,能否总结下您接触的各种语言的特色和缺陷,比如该语言的最佳适用场景,吐槽下该语言不好的地方,比如c++的RAII,javascript的promise就是他们的特色

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

    2018-01-13
    1
  • Ray
    有时候会写出在try块里面出现try块的情况,请问这种写法应该避免还是得看具体的业务?
    2018-01-09
    1
  • milley
    耗子叔举例讲解了不同语言不同用法,最终得出实践。虽然每种都是略懂,但是看完觉得很有启发。
    2017-11-30
    1
  • Chris
    老师好,你的文章很有质量,很好,不过我是属于初级,能否谈谈对于文章内可能看不懂的地方,自己应该如何解决这个问题?希望你能指导一下,谢谢!
    2017-11-10
    1
  • 记忆犹存
    async/await异步调用的try catch设计思路是参考了C#?还是C#参考了JavaScript?
    总之这个语法糖蛮好用的
    2019-09-24
  • edisonhuang
    错误处理需要我们为错误定义统一的错误状态字典,错误的基类最好是易于扩展的,为错误定义不同的等级,记录好错误日志,不要轻易忽略错误,尽可能在错误发生的地方处理错误,原样返回错误信息。对于异步编程,推荐使用Promise模式处理错误。
    2019-05-30
  • 黑猫大侠
    讲的很全面,都分析到了,说的基本都明白,就是从来没有人来总结过。这次,算是帮大家一起学习总结了,都在不断不断提炼中。代码规范真的很重要,code view也很重要,tra catch 这种模式 + 自定义返回状态码 + 还可以自己抛出异常。语言层面从js 中的promise切入,建议可以再去看看liao雪峰老师的promise的讲解,resolve 就是结果正常需要异步跑出来丢给then去执行的事情结果,reject就类似catch捕获到的东西。
    2019-05-10
  • 西关八号
    错误里面里面的大学问,学习了
    2019-03-27
  • wanerming
    BUG:左右滑动代码块时,文章有时会退出详情页,进到文章列表页
    2019-02-02
收起评论
25
返回
顶部