Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

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

思考题
总结
异常的使用场景与注意点
用户自定义异常
如何处理异常
错误与异常
异常处理

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

你好,我是景霄。
今天这节课,我想和你聊聊 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

异常处理在Python中是一项重要的机制和代码规范。本文首先介绍了错误与异常的概念,强调了它们的联系和区别。接着详细讲解了异常处理的方法,包括使用try和except来捕获异常,并介绍了多种处理异常的技巧。此外,文章还提到了finally的用法,以及如何自定义异常类型。异常处理对于提高程序的稳定性至关重要,读者可以通过本文快速了解异常处理的基本概念和在Python中的应用方法。 在文章中,还强调了异常处理的使用场景和注意点。作者指出,异常处理通常用于处理无法确定代码能否成功执行的情况,比如数据库的连接、读取等。然而,也警示读者不要滥用异常处理,避免对阅读和协作造成障碍。文章最后提出了一个思考题,让读者思考在异常处理时,如果try block中有多处抛出异常,需要使用多个try except block吗,以及给出了两种不同的写法,让读者思考哪种更好。 总的来说,本文通过实际场景的例子和技术细节,帮助读者全面了解了Python中异常处理的重要性、基本概念和应用方法。读者可以从中获得丰富的技术知识和实践经验,提高对异常处理的理解和运用能力。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(95)

  • 最新
  • 精选
  • 小云同学
    老师,看到异常这一讲,忽然想起了一个问题,一直困扰着我 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
    6
    164
  • Hoo-Ah
    第一种写法更加简洁,易于阅读。而且except后面的错误类型先抛出数据库连接错误,之后才抛出查询错误,实现的异常处理和第二种一样。

    作者回复: 正解

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

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

    2019-05-27
    3
    16
  • John Si
    1. 第一種寫法比第二種寫法簡潔 2. 因我對try語法執行流程不太清楚,還是老師跟熟悉該同學多講解一下。但我自己想法是第二種寫法跟巢狀迴圈寫法很像,假設是第二句語法發生錯誤,第二種寫法會多執行一次try 語句,從而增加了程序運行時間。 綜上所述,我認為第一種寫法較第二種好

    作者回复: 正解

    2019-05-27
    4
  • 小豹子
    老师,系统异常,非系统异常能举个例子说明下吗?

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

    2019-05-27
    3
  • Kevin
    从代码行数看第一种更简洁,第一种中,使用了一个try..expect将异常统一处理,代码简洁, 第二种,代码中有嵌套,

    作者回复: 正解

    2020-06-17
    1
  • 王大华
    第一种和第二种效果类似, 都是先检查数据库连接异常,再检查query执行的异常。 更喜欢这种写法: try: db = DB.connect('<db path>') # 可能会抛出异常 raw_data = DB.queryData('<viewer_id>') # 可能会抛出异常 except DBConnectionError as err: print('ConnectionError: {}'.format(err)) except DBQueryDataError as err: print('QueryDataError: {}'.format(err))

    作者回复: 回答的很对

    2020-02-02
    2
    1
  • 一粒
    老师,什么样的代码才是您说的“flow-control”

    作者回复: 比如条件语句 if,循环语句for,while等等

    2020-01-02
    1
  • Geek_David
    个人觉得这个课还要加上一本python的书,那就天衣无缝了

    作者回复: 书的话内容太过冗余了,这个课就是提炼一些精华了

    2020-03-29
  • 百年
    老师的课收获比较大,Python基础课也学过,Python核心机制也学过一点,但是一写代码,特别是实时读写文件,总是报一大堆错误,这结课真的是运用上了。

    作者回复: 谢谢支持,也请多多分享给你的朋友

    2019-05-29
收起评论
显示
设置
留言
95
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部