1 异常机制
对于执行可能出现错误的代码,python提供异常机制以防止程序中断。
try:
some code...
except exception_class as e:
do_something1
finally:
do_something2
说明:
- 在
some code...
里遇到异常就退出try
块,进入异常类对应的except
语句 finally
后的语句是不管是否有异常都会执行的。- 异常类都继承自
BaseException
,常见异常类型和继承关系见官方文档
try:
print('try...')
r = 10 / int('0')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
执行结果:
try...
ZeroDivisionError: division by zero
finally...
END
2 抛出异常
- 除了使用
except
语句外,可以通过raise
主动抛出异常实例。 - 如有必要,可以自己定义异常类(继承自python自带的异常类)。
# test.py
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
foo('0')
执行后输出,可以跟踪到异常类:
Traceback (most recent call last):
File "test.py", line 10, in <module>
foo('0')
File "test.py", line 7, in foo
raise FooError('invalid value: %s' % s)
__main__.FooError: invalid value: 0
注意:
raise
语句如果不带参数,就会把当前错误原样抛出。raise
抛出异常便于追踪,且可以把一种异常类型转化为另一种类型:
# test.py
def foo(a, b):
if b == 0:
raise ValueError('invalid value: 0')
return a / b
try:
a, b = 10, 0
foo(a, b)
except ZeroDivisionError:
raise
执行输出:
Traceback (most recent call last):
File "test.py", line 8, in <module>
foo(a, b)
File "test.py", line 3, in foo
raise ValueError('invalid value: 0')
ValueError: invalid value: 0