首页 > Python3教程 > Python3异常与错误处理

Python3 异常处理

异常定义

异常是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。

异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

异常处理

捕捉异常使用try/except语句。当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

如果没有错误发生,except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)。错误有很多种类,如果发生了不同类型的错误,应该由不同的except语句块处理。没错,可以有多个except来捕获不同类型的错误。

如果不想在异常发生时结束你的程序,只需在try里捕获它。

try....except...else的语法:

try:
<语句> #运行别的代码
except <名字>
<语句> #如果在try部份引发了'name'异常
except <名字><数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生

try语句的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

  1. 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
  2. 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
  3. 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
fh = open("python", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print ("Error: 没有找到文件或读取文件失败")
else:
print ("内容写入文件成功")
fh.close()

如果文件没有写入权限,程序会提示错误

except而不带任何异常类型

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

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

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

使用except而带多种异常类型

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

try:
正常的操作
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
发生以上多个异常中的一个,执行这块代码
......................
else:
如果没有异常执行这块代码
try:
print('try...')
r = 10 / int('a')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
finally:
print('finally...')
print('END')

int()函数可能会抛出ValueError,所以用一个except捕获ValueError,用另一个except捕获ZeroDivisionError。

try...except捕获错误可以跨越多层调用,如函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就能处理错误。不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后再次被抛出。

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

抛出异常

Python 使用 raise 语句抛出一个指定的异常。

try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

调用栈

如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。

记录错误

如果不捕获错误,让Python解释器来打印出错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。

Python内置的logging模块可以非常容易地记录错误信息。

 用户自定义异常

你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承。

class MyError(Exception):
def __init__(self, value):
self.value = value

def __str__(self):
return repr(self.value)

try:
raise MyError(2 * 2)
except MyError as e:
print('My exception occurred, value:', e.value)

这个例子中,类 Exception 默认的 __init__() 被覆盖。

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。