python错误继承表:

https://docs.python.org/3/library/exceptions.html#exception-hierarchy


格式:

def 函数():

try:

内容 ###正确输出

except 错误表 in e:

输出内容###错误输出

finally:

输出内容##必定输出

print('END') ##必定输出


#!/usr/bin/python#-*-coding:utf-8-*-deffoo(s):return10/int(s)defbar(s):returnfoo(s)*2defmain():try:bar('0')exceptExceptionase:print('Error:',e)finally:print('finally...')main()

运行结果:

('Error:',ZeroDivisionError('integerdivisionormodulobyzero',))finally...


a.面对函数层层调用,try...except能捕捉得到。

b.类的子类错误也能捕捉得到,如捕捉ValueError错误,顺便也会把UnicodeError也捕捉了

+--ValueError|+--UnicodeError|+--UnicodeDecodeError|+--UnicodeEncodeError|+--UnicodeTranslateError



记录错误到日志文件:

#!/usr/bin/python#-*-coding:utf-8-*-importlogging###########记得导入模块deffoo(s):return10/int(s)defbar(s):returnfoo(s)*2defmain():try:bar('0')exceptExceptionase:logging.exception(e)#########模块函数使用print('haha')main()print('END')

运行结果:

hahaENDERROR:root:divisionbyzeroTraceback(mostrecentcalllast):File"/usercode/file.py",line14,inmainbar('0')File"/usercode/file.py",line10,inbarreturnfoo(s)*2File"/usercode/file.py",line7,infooreturn10/int(s)ZeroDivisionError:divisionbyzero


当不用错误调试时,普通的程序出错会调用栈Traceback提示错误

deffoo(s):return10/int(s)defbar(s):returnfoo(s)*2defmain():bar('0')main()

运行结果:

Traceback(mostrecentcalllast):File"/usercode/file.py",line13,in<module>main()File"/usercode/file.py",line11,inmainbar('0')File"/usercode/file.py",line8,inbarreturnfoo(s)*2File"/usercode/file.py",line5,infooreturn10/int(s)ZeroDivisionError:integerdivisionormodulobyzero



抛出错误:raise

deffoo(s):n=int(s)ifn==0:raiseValueError('invalidvalue:%s'%s)return10/ndefbar():try:foo('0')exceptValueErrorase:print('ValueError!',e)raisebar()

运行结果:

('ValueError!',ValueError('invalidvalue:0',))Traceback(mostrecentcalllast):File"/usercode/file.py",line17,in<module>bar()File"/usercode/file.py",line12,inbarfoo('0')File"/usercode/file.py",line7,infooraiseValueError('invalidvalue:%s'%s)ValueError:invalidvalue:0