Python学习第16天:Python 错误和异常[1]

118 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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 语句。