Exception,python的错误处理学习总结
高级语言都会使用内置的一套try...except...finally...的错误处理机制, 可以更高效的处理错误,
无需程序员自己写错误处理的代码。
try
try:
print('try...')
r = 10 / int('2')
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')
- 如果有错误,根据发生不同类型的错误,使用不同的except处理。
- int('a')会出发 ValueError
- 10/0会触发ZeroDivisionError。
- 否则代表没有错误,则执行else。
- 最后都要执行finally
常见的错误类型和继承关系
看文档Built-in Exceptions
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
try的好处
可以跨多层调用。函数main()调用bar(), bar调用foo(), 只要期间发生错误,try就会处理。
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
print('Error:', e)
finally:
print('finally...')
调用栈
如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序终止。
错误信息是Traceback (most recent call last)...。它是一个错误路径。可以在最后查看错误原因,定位错误位置。
logging模块
可以把错误信息记录到日志。并让程序继续执行。
# err_logging.pyimport logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
(e)
main()
print('END')
抛出错误
为错误是class,捕获一个错误就是捕获到该class的一个实例。所以,错误是根据情况故意创建的错误实例。
内置函数有各种类型的错误。也可以自己编写函数,然后抛出错误。
# err_raise.pyclass FooError(ValueError):
passdef foo(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
foo('0')
- 编写一个错误类FooError。
- 用raise语句,生成FooError的实例。
尽量使用内置的函数。如ValueError, TypeError
THE END




