- Python复习笔记——异常处理结构
- try except结构
- 带有多个except的try结构
- try except finally结构
- 断言与上下文管理
- 简单地说,异常是指程序运行时引发的错误,引发错误的原因有很多,例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等
- 如果这些错误得不到正确的处理将会导致程序终止运行,而合理地使用异常处理结构可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时原因而造成程序终止
- 也可以使用异常处理结构为用户提供更加友好的提示
try: try块 #被监控的语句 except Exception[ as reason]: except块 #处理异常的语句
- 需要捕获所有异常时,可以使用BaseException
try: try块 except BaseException as e: #不建议这样做 except块...... #处理所有错误
- except子句可以在异常类名字后指定一个变量
>>> try:
raise Exception('spam', 'eggs')
except Exception as inst:
print(type(inst)) # the exception instance
print(inst.args) # arguments stored in .args
print(inst) # __str__ allows args to be printed directly,
# but may be overridden in exception subclasses
x, y = inst.args # unpack args
print('x =', x)
print('y =', y)
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
- 如果try中的代码抛出了异常并被except捕获,就执行except块;如果try中的代码没有抛出异常,就执行else块
a_list = ['China', 'America', 'England', 'France']
while True:
n = input('请输入字符串的序号:')
try:
n = int(n)
print(a_list[n])
except IndexError:
print('列表的下标必须为[0,3]之间的整数')
else:
break
带有多个except的try结构
try:
x=input('请输入被除数: ')
y=input('请输入除数: ')
z=float(x) / float(y)
except ZeroDivisionError:
print('除数不能为零')
except ValueError:
print('被除数和除数应为数值类型')
except NameError:
print('变量不存在')
else:
print(x, '/', y, '=', z)
- 将要捕获的异常写在一个元组中,可以使用一个excep语句捕获多个异常;但并不建议这样做
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
f.close()
except (OSError, ValueError,RuntimeError, NameError):
pass
try except finally结构
- 在该结构中,finally子句中的内容无论是否发生异常都会执行,常用来做一些清理工作以释放try子句中申请的资源
>>> try: 3/0 except: print(3) finally: print(5) 3 5
- 如果try子句中的异常没有被处理,或者在except子句或else子句中出现了异常,那么这些异常将会在finally子句执行完后再次抛出
>>> try:
3/0
finally:
print(5)
5
Traceback (most recent call last):
File "", line 1, in
try:3/0
finally:
print(5)
ZeroDivisionError: division by zero
断言与上下文管理
-
断言与上下文管理是两种比较特殊的异常处理方式,在形式上比异常处理结构要简单一些
-
assert expression[, reason]
-
当判断表达式expression为真时,什么都不做;如果表达式为假,则抛出异常
-
assert语句一般用于开发程序时对特定必须满足的条件进行验证,仅当__debug__为True时有效。当Python脚本以-O选项编译为字节码文件时,assert语
句将被移除以提高运行速度
>>> a = 3 >>> b = 5 >>> assert a==b, 'a must be equal to b' Traceback (most recent call last): File "", line 1, in assert a==b, 'a must be equal to b' AssertionError: a must be equal to b >>> try: assert a==b, 'a must be equal to b' except AssertionError as reason: print('%s:%s'%(reason.__class__.__name__, reason)) AssertionError:a must be equal to b
- 使用with自动关闭资源,可以在代码块执行完毕后还原进入该代码块时的现场
- 不论何种原因跳出with块,不论是否发生异常,总能保证文件被正确关闭,资源被正确释放
- with语句的语法如下:
with context_expr [as var]:
with块
输出文本文件中的所有行
with open("myfile.txt") as f:
for line in f:
print(line, end="")



