Python-Task8 异常处理

Python-Task8 异常处理

学习内容

廖雪峰老师python教程https://www.liaoxuefeng.com/wiki/1016959663602400


程序运行过程中主要包含以下几类错误

  1. 程序本身错误
  2. 用户输入错误
  3. 无法预测的错误

错误处理

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来处理错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值