异常处理

  • 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。

  • 一般情况下,在 Python 无法正常处理程序时就会发生一个异常。

捕捉异常可以使用 try/except 语句。

try 语句的工作原理如下:

  • 首先,执行 try 子句 (tryexcept 关键字之间的(多行)语句)。
  • 如果没有异常发生,则跳过 except 子句并完成 try 语句的执行。
  • 如果在执行 try子句时发生了异常,则跳过该子句中剩下的部分。然后,如果异常的类型和 except 关键字后面的异常匹配,则执行 except 子句 ,然后继续执行 try 语句之后的代码。
  • 如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的try语句中;如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如下所示的消息。

例子:

>>> try:
    x = int(input('请输入:'))
except ValueError:
    print('abcde') ### ValueError异常,执行该部分
else:
    print('12345') ### 无异常,则跳过 except 部分而执行该 else 部分

请输入:5
12345
请输入:a
abcde

>>> try:
    x = int(input('请输入:'))
except NameError:
    print('abcde')
else:
    print('12345')

请输入:a
Traceback (most recent call last):
  File "<pyshell#29>", line 2, in <module>
    x = int(input())
ValueError: invalid literal for int() with base 10: 'a'

不带任何异常类型

你可以不带任何异常类型使用except,如下实例:

try:
    正常的操作
except:
    发生异常,执行这块代码
else:
    如果没有异常执行这块代码`

以上方式 try-except 语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。

带多种异常类型

你也可以使用相同的 except 语句来处理多个异常信息,如下所示:

try:
    正常的操作
except(Exception1[, Exception2[,...ExceptionN]]):
   发生以上多个异常中的一个,执行这块代码
else:
    如果没有异常执行这块代码

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

try:
    <语句>
finally:
    <语句>    #退出try时总会执行
raise

例子:

>>> try:
    x = int(input('请输入:'))
except ValueError:
    print('abcde')
else:
    print('12345')
finally:
    print('hello world')

请输入:a
abcde
hello world

>>> try:
    x = int(input('请输入:'))
except NameError:
    print('abcde')
else:
    print('12345')
finally:
    print('hello world')

请输入:a
hello world
Traceback (most recent call last):
  File "<pyshell#38>", line 2, in <module>
    x = int(input('请输入:'))
ValueError: invalid literal for int() with base 10: 'a'

raise 语句

raise 语句允许用户自行强制发生指定的异常。

例如:

>>> raise NameError('Hello Wrong World')
Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    raise NameError('Hello Wrong World')
NameError: Hello Wrong World