Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
13891 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从工程的角度深入理解Python
免费
基础篇 (14讲)
01 | 如何逐步突破,成为Python高手?
02 | Jupyter Notebook为什么是现代Python的必学技术?
03 | 列表和元组,到底用哪一个?
04 | 字典、集合,你真的了解吗?
05 | 深入浅出字符串
06 | Python “黑箱”:输入与输出
07 | 修炼基本功:条件与循环
08 | 异常处理:如何提高程序的稳定性?
09 | 不可或缺的自定义函数
10 | 简约不简单的匿名函数
11 | 面向对象(上):从生活中的类比说起
12 | 面向对象(下):如何实现一个搜索引擎?
13 | 搭建积木:Python 模块化
14 | 答疑(一):列表和元组的内部实现是怎样的?
进阶篇 (11讲)
15 | Python对象的比较、拷贝
16 | 值传递,引用传递or其他,Python里参数是如何传递的?
17 | 强大的装饰器
18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?
19 | 深入理解迭代器和生成器
20 | 揭秘 Python 协程
21 | Python并发编程之Futures
22 | 并发编程之Asyncio
23 | 你真的懂Python GIL(全局解释器锁)吗?
24 | 带你解析 Python 垃圾回收机制
25 | 答疑(二):GIL与多线程是什么关系呢?
规范篇 (7讲)
26 | 活都来不及干了,还有空注意代码风格?!
27 | 学会合理分解代码,提高代码可读性
28 | 如何合理利用assert?
29 | 巧用上下文管理器和With语句精简代码
30 | 真的有必要写单元测试吗?
31 | pdb & cProfile:调试和性能分析的法宝
32 | 答疑(三):如何选择合适的异常处理方式?
量化交易实战篇 (8讲)
33 | 带你初探量化世界
免费
34 | RESTful & Socket: 搭建交易执行层核心
35 | RESTful & Socket: 行情数据对接和抓取
36 | Pandas & Numpy: 策略与回测系统
免费
37 | Kafka & ZMQ:自动化交易流水线
38 | MySQL:日志和数据存储系统
39 | Django:搭建监控平台
40 | 总结:Python中的数据结构与算法全景
技术见闻与分享 (4讲)
41 | 硅谷一线互联网公司的工作体验
42 | 细数技术研发的注意事项
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
43 | Q&A:聊一聊职业发展和选择
结束语 (1讲)
结束语 | 技术之外的几点成长建议
Python核心技术与实战
登录|注册

08 | 异常处理:如何提高程序的稳定性?

景霄 2019-05-27
你好,我是景霄。
今天这节课,我想和你聊聊 Python 的异常处理。和其他语言一样,异常处理是 Python 中一种很常见,并且很重要的机制与代码规范。
我在实际工作中,见过很多次这样的情况:一位工程师提交了代码,不过代码某处忘记了异常处理。碰巧这种异常发生的频率不低,所以在代码 push 到线上后没多久,就会收到紧急通知——服务器崩溃了。
如果事情严重,对用户的影响也很大,这位工程师还得去专门的会议上做自我检讨,可以说是很惨了。这类事件层出不穷,也告诉我们,正确理解和处理程序中的异常尤为关键。

错误与异常

首先要了解,Python 中的错误和异常是什么?两者之间又有什么联系和区别呢?
通常来说,程序中的错误至少包括两种,一种是语法错误,另一种则是异常。
所谓语法错误,你应该很清楚,也就是你写的代码不符合编程规范,无法被识别与执行,比如下面这个例子:
if name is not None
print(name)
If 语句漏掉了冒号,不符合 Python 的语法规范,所以程序就会报错invalid syntax
而异常则是指程序的语法正确,也可以被执行,但在执行过程中遇到了错误,抛出了异常,比如下面的 3 个例子:
10 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
order * 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'order' is not defined
1 + [1, 2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'
它们语法完全正确,但显然,我们不能做除法时让分母为 0;也不能使用未定义的变量做运算;而让一个整型和一个列表相加也是不可取的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(67)

  • 不瘦到140不改名
    老师,看到异常这一讲,忽然想起了一个问题,一直困扰着我
    e = 1
    try:
        1 / 0
    except ZeroDivisionError as e:
        pass

    print(e) # NameError: name 'e' is not defined
    这里为什么会显示e没有被定义呢?

    作者回复: 你可以阅读官方文档:https://docs.python.org/3/reference/compound_stmts.html#the-try-statement

    "When an exception has been assigned using as target, it is cleared at the end of the except clause."

    比如下面这个code block:
    except E as N:
        foo

    就等于
    except E as N:
        try:
            foo
        finally:
            del N

    因此你例子中的e最后被delete了,所以会抛出NameError

    2019-05-27
    4
    52
  • Hoo-Ah
    第一种写法更加简洁,易于阅读。而且except后面的错误类型先抛出数据库连接错误,之后才抛出查询错误,实现的异常处理和第二种一样。

    作者回复: 正解

    2019-05-27
    39
  • Geek_b6f316
    第一种方法简单明了,是不是少了一个as
    2019-05-27
    15
  • Fergus
    选择1,原因有2:
    1. 从开始学就如①这么写的;
    2. ②读起来太难受,太不pythonic;

    读了留言后意识到:
    3. ①与②的运行逻辑一致,①可以看作②的简化版;
    4. ②的写法,如出现异常,多次调用异常处理,降低程序运行效率;

    多谢小伙伴们👍
    2019-05-28
    8
  • liput
    想请问老师,在facebook里面开发,对于异常处理有什么规范需要遵循吗?自定义异常、抛异常、捕获异常,粒度一般怎么把控呢?
    与此相应的,我对日志输出也有同样的疑问,希望老师能结合您在大公司里的实战经验多讲讲。

    作者回复: 我会在最后一章里对大公司开发的规范,流程做一个详细的介绍。通常来说,异常能用内置的exception就用,如果需要自定义就自定义,看实际的需求。一般来说异常抛出,我们都会对其进行Log(一般每1000次log一次),输出到real time的table和dashboard里,这样有利于之后的分析和改进。

    2019-05-27
    1
    7
  • 太平湖-燃气(DUYANG)18356257...
    什么是flow-control。。
    2019-05-31
    2
    3
  • John Si
    1. 第一種寫法比第二種寫法簡潔
    2. 因我對try語法執行流程不太清楚,還是老師跟熟悉該同學多講解一下。但我自己想法是第二種寫法跟巢狀迴圈寫法很像,假設是第二句語法發生錯誤,第二種寫法會多執行一次try 語句,從而增加了程序運行時間。

    綜上所述,我認為第一種寫法較第二種好

    作者回复: 正解

    2019-05-27
    3
  • third
    小白提问
    针对06思考的第一问,分次读取文件
    读取完成一个很大的文件之后,这些文件存放在哪里?
    如果这个文件大到了无法一次读取内存,那么他是否应该存储在磁盘中?在需要用的时候,又从磁盘中调取呢?
    希望老师解释一下
    2019-05-27
    2
  • Python高效编程
    第一种方式清晰一点
    2019-05-27
    2
  • 秦晋
    思考题: 第一种比较好,第二种多层嵌套

    还有,文章中举的例子,字典我一般获取使用 d.get("bob", None)这种方式,不会报异常,没有直接返回None
    2019-07-11
    1
  • helloworld
    老师,对文中的自定义异常不太理解,为什么要主动去raise自定义异常,有啥意义吗
    2019-05-29
    2
    1
  • 无才不肖生
    老师,想问个题外题
    对象的属性是个字典,django中要根据属性里字典的某个键值查询该怎么做呢,如下面的,我想直接根据companyType来查询过滤记录
    person
    {
        IDCard:12345678901,
        name:emily
        companys:
            companyName:'阿里',
            companyType:'电商'
    }
    2019-05-28
    1
  • Geek_41743c
    dict取值是不是用get()比较好。
    2019-05-28
    1
  • SCAR
    应该是第一种情况更优:
    1. 从实现的功能来看第一种和第二种都能达到,不过程序里两种异常是线性依次的,所以完全可以并行写在一个except里,再者python里的标准异常都__str__处理过,是完全可以区分哪个异常发生的。
    2. 但就像the zen of python里强调的那样,简单和清晰是 python代码应该遵从的,显然第一种更优。
    2019-05-27
    1
  • alan
    老师好,相比try-catch的错误处理模式,您觉得Golang那样的返回error的错误处理方式怎么样?您更喜欢哪种错误处理方式?
    2019-05-27
    1
  • 小豹子
    老师,系统异常,非系统异常能举个例子说明下吗?

    作者回复: 系统异常比如说keyboardInterrupt

    2019-05-27
    1
  • leixin
    期待更进阶的。
    2019-05-27
    1
  • 王校
    第一种对阅读程序的人更友好。
    2019-05-27
    1
  • Basic Φ
    景老师,json的异常都有哪些,可以从哪里查到?
    2019-12-11
  • 第一种,功能一样,第一种更简洁。
    2019-12-11
收起评论
67
返回
顶部