携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情 >>
我们在执行程序语句的时候,经常会看到命令行输出报错信息,例如:
>>> while True print('Hello world')
File "<stdin>", line 1, in ?
while True print('Hello world')
^
SyntaxError: invalid syntax
这种报错信息会阻止程序正常运行,也就是我们要介绍的错误和异常。
错误
我们说的错误指的是Python的语法错误,例如:
>>> if 1=1: print('always')
File "<stdin>", line 1
if 1=1: print('always')
^
SyntaxError: invalid syntax
上面例子中,在判断相等的时候应该用''==',而不是用'=',执行的时候,语法解析器检查到有错误,程序语句终止执行,并将错误的地方用上箭头指出来。
语法错误很好解决,根据命令行提示的错误位置,检查语法,改正即可。
异常
在Python中,即使你的代码没有语法错误,也不能保证程序按照你的想法运行完毕,因为在程序执行过程中也会有错误。程序运行期间检测到的错误被称为异常,例如:
>>> '1' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly
大多数的异常都不会被程序处理,都以错误信息的形式显示出来,如上例所示,提示信息告诉我们int类型不能和str类型相加。
错误提示信息会告诉我们异常发生的上下文,并以调用栈的形式显示具体信息,提示信息的最后一行开头会显示错误类型名称,上例中,错误类型为'TypeError',表示类型异常。
什么是异常
异常是一个事件,该事件会在程序执行过程中发生,从而影响程序的正常执行。当 Python遇到无法处理的程序时,就会引发一个异常。在 Python 中,异常是一个对象,用于表示一个错误,当 Python脚本发生异常时我们需要捕获和处理它,否则程序会终止执行。
处理异常
Python 提供了 try/except语句用来捕获和处理异常。try 语句用来检测语句块中是否有错误,except 语句则用来捕获 try 语句中的异常,并进行处理,附加的 else 可以在 try 语句没有异常时执行。
语法
下面以最简单的 try...except...else 为例:
try:
statement(s) # 要检测的语句块
except exception:
deal_exception_code # 如果在 try 部份引发了 'exception' 异常
except exception2, e:
deal_exception2_code # 如果引发了 'exception2' 异常
else:
no_exception_happend_code #如果没有异常发生
try 语句的执行逻辑如下:
- 首先,执行 try 子句 (try 和 except 关键字之间的(多行)语句)。
- 如果没有异常发生,则跳过 except 子句 并完成 try 语句的执行。
- 如果在执行try 子句时发生了异常,则跳过该子句中剩下的部分。然后,如果异常的类型和 except 关键字后面的异常匹配,则执行 except 子句,然后继续执行 try 语句之后的代码。
- 如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示错误消息。
- 如果 try 语句执行时没有发生异常,那么将执行 else 语句后的语句(如果有 else 的话),然后控制流通过整个 try 语句。