Python3 的错误和异常处理方法
Python3 的运行错误以异常的方式抛出。
捕获异常
用 try...except...except...else...finally 捕获异常,支持同时处理多种类型的异常:
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
else 后面的语句是在没有异常时执行的语句,该语句必须在 except 之后:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except OSError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
finally 中的语句无论是否发生异常,都要在离开 try 语句前执行,通常是清理操作:
>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
...
Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
抛出异常
用 raise 主动抛出异常,抛出异常时,可以传入参数,之后通过异常变量的 args 获取:
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)
异常的种类
所有的异常源自 Exception 类,可以自定义异常:
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
带有自动清理的变量
有一些变量具有自我清理功能,配合 with 使用,例如下面的文件对象 f 会自动关闭:
with open("myfile.txt") as f:
for line in f:
print(line, end="")