本文主要是介绍《极客时间 - 左耳听风》【文章笔记个人思考】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《极客时间 - 左耳听风》原文链接:https://time.geekbang.org/column/intro/100002201?tab=catalog
- 10 | 如何成为一个大家愿意追随的Leader?
- 11 | 程序中的错误处理:错误返回码和异常捕捉
10 | 如何成为一个大家愿意追随的Leader?
这里的Leader是在技术上取得优势,而不是行政上的职位,不是一种职称而是领头羊。
Leader:
- 讨论工作细节,关注工作重点,制定工作计划,解决细节难题。
- 深入技术细节,从技术上找到治标又治本的技术方案或管理方法。
- 注重技术发展。
- 沟通协作。
TUTU
如何成为Leader?
- 帮人解决问题。
- 被人依赖。
技术领导力是成为一个Leader的关键因素。
人总是需要有不同的经历,优秀的人更是如此。
Always Be Coding 终身写代码才会有更多实践经验,才能明白什么是最好的实践,才能明白一个技术方案的优缺点和实现复杂度。很多时候项目经理或产品经理一个自己认为很简单的需求,在技术上实现的时候可能会遇到很多坑。
保持积极、正面、热情的生活方式。
正视错误,正视问题,正视不足,不怕困难,迎难而上,在反思和总结中得到更好的解决方案。
互相学习,互相提高,互相成就。
11 | 程序中的错误处理:错误返回码和异常捕捉
确实,任何一个稳定的系统中,都会用大量代码处理错误。
strtol() 函数使用 返回值 +错误码的形式。
存在两个问题:
- 程序员一不小心就会忘记返回值的检查,从而造成代码的 Bug,这经常会遇到。
- 函数接口非常不纯洁,正常值和错误值混淆在一起,导致语义有问题。
Windows 的系统调用开始使用 HRESULT:返回值只用来做函数调用的成功或失败,input 和 output 通过函数参数来完成。
存在问题:
- 函数接口变的复杂。
- 函数返回成功或失败可能被认为忽略。
Go语言很多函数通过多返回值来解决:返回 result, err 两个值。(个人觉得放在同样的返回位置不清晰,不如用返回值只用来做函数调用的成功或失败,input 和 output 通过函数参数来完成。)
- 参数都是入参,结果信息和错误信息分离,函数接口语义会更加清晰。
- Go 语言中的错误参数如果要忽略,需要显式地忽略,用 _ 这样的变量来忽略;(为什么要忽略,如何忽略,TUCODE)
- 返回的 error 是个接口(其中只有一个方法 Error(),返回一个 string ),所以你可以扩展自定义的错误处理。(TUCODE)
- 函数会返回多种不同类型的 error 通过 switch case 处理。
资源清理:
- 通过C++ 的 RAII 机制实现。
- Go语言中的 defer 关键字可以做到同样的效果。
- C语言通过 goto 语句实现,代码中间不能 return 否则会导致内存泄漏。
异常捕获处理:try-catch
- 正常的代码、错误处理的代码、资源清理的代码分开,提高了代码的可读性。
- 函数接口在 input(参数)和 output(返回值)以及错误处理的语义是比较清楚的。
- 异常不能被忽略(如果要忽略也需要 catch 住,这是显式忽略)。(TOTHINK)
- 在面向对象的语言中(如 Java),异常是个对象,所以,可以实现多态式的 catch。(TOCODE)
致命问题:在异步运行的世界里的问题。try 语句块里的函数运行在另外一个线程中,其中抛出的异常无法在调用者的这个线程中被捕捉。
资源错误(文件资源,内存资源):日志 + 程序退出。 根据系统底层接口处理。
业务逻辑代码错误:日志 + 报警。捕获异常。
用户的错误:向用户端报错。返回错误码。
运行环境错误:日志 + 报警。重试或妥协(降低性能等),保障环境可用。捕获异常。
底层系统的资源错误,提供什么错误处理方式就用什么错误处理方式,尤其是一些系统库没的选择。
其他情况:
- 在 C++ 重载操作符的情况下,你就很难使用错误返回码,只能抛异常;
- 异常捕捉只能在同步的情况下使用,在异步模式下,抛异常这事就不行了,需要通过检查子进程退出码或是回调函数来解决;
- 在分布式的情况下,调用远程服务只能看错误返回码,比如 HTTP 的返回码。
《代码大全2》里有部分是专门讲这个的,很详细。
这篇关于《极客时间 - 左耳听风》【文章笔记个人思考】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!