Python-Task8 异常处理
学习内容
廖雪峰老师python教程https://www.liaoxuefeng.com/wiki/1016959663602400
程序运行过程中主要包含以下几类错误
- 程序本身错误
- 用户输入错误
- 无法预测的错误
错误处理
try:
print('try...')
r=10/int('2')
print('result:',r)
except ZeroDivisionError as e:
print('ZeroDivisionError:',e)
except ValueError as e:
print('ValueError:',e)
else:
print('no error')
finally:
print('finally')
print('END')
将你认为可能出错的代码放入try语句块,如果出错语句块中后续代码不会继续执行。
出错后,会跳转到except语句块,可以有多个except语句块,用于处理不同的捕获异常。
else语句是可有可无的,如果没有任何一个except语句块被执行,则执行else语句块的内容。
finally可有可无,无论是否有误都会执行其语句块的内容。
注意:错误也是class,所有错误类型都是继承自BaseException。在使用except是,它不但会捕获该类型错误,还会把其子类一网打尽
常见错误类型和继承关系。
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
try…except 可以跨越多层调用,错误会被一层一层向上抛,如果没有被捕获,最后会被python解释器捕获,此时程序会推出。如果我们能够捕获住错误,那么程序会继续执行下去。
调用栈分析错误
$ python3 err.py
Traceback (most recent call last): #告诉我们这是错误信息
File "err.py", line 11, in <module> 调用main出错了,在err.py文件第11行,但原因在第9含
main()
File "err.py", line 9, in main 调用bar('0')出错了,在代码err.py,但原因在第6行
bar('0')
File "err.py", line 6, in bar
return foo(s) * 2
File "err.py", line 3, in foo
return 10 / int(s) #依次向下找,终于找到错误源头
ZeroDivisionError: division by zero #找到错误原因
记录错误
我们可以使用python内置的logging模块记录错误信息
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
这样logging可以将调用栈的一些错误信息打印出来,并且不会退出程序,会继续执行,正常退出。
总结
出错时,我们需要通过调用栈来分析错误信息并且定位错误代码的位置。并且可以使用内置的 try except finally来处理错误。