python 学习笔记10(错误处理) 2018-04-23
2018-04-23 本文已影响0人
我是帅气的石头
一,错误处理
try...except...finally
错误处理机制
通过列子看看try
机制:
try:
print('try...')
r=10/0
print('result:{0}'.format(r)) #前面没有错误就执行这里
except ZeroDivisionError as e:
print("except:{0}".format(e)) #返回错误就执行这步
finally:
print('finally....') #不管有没有错误,都会执行finally这一步
print('END')
例子中,r=10/0
报错,except
由于捕获到ZeroDivisionError
,因此被执行就会直接执行except这一步,不会再执行print('result:{0}'.format(r))
这一步。如果有finally
这步,就会继续执行finally
这一步。
打印结果:
try...
except:division by zero
finally....
END
然后我们再看一个没有报错的列子:
try:
print('try...')
r=10/5 #正常
print('result:{0}'.format(r)) #前面没有错误就执行这里
except ZeroDivisionError as e:
print("except:{0}".format(e)) #返回错误就执行这步
finally:
print('finally....') #不管有没有错误,都会执行finally这一步
print('END')
这回r=10/5
正常执行,然后我们先看看打印结果:
try...
result:2.0
finally....
END
从结果中可以看到,try
没有报错,函数正常执行,except
语句块就不会执行,如果存在finally
,就会执行finally
这一步;
except语句块处理不同类型的错误
try:
print('try...')
r=10/int('a')
print('result:{0}'.format(r)) #前面没有错误就执行这里
except ValueError as e: #捕捉到ValueError 就执行这段语句块
print("ValueError:{0}".format(e))
except ZeroDivisionError as e: #捕捉到ZeroDivisionError 就执行这段语句块
print("except:{0}".format(e))
finally:
print('finally....') #不管有没有错误,都会执行finally这一步
print('END')
int()
函数可能会抛出ValueError
,所以我们用一个except
捕获ValueError
,用另一个except
捕获ZeroDivisionError
运行结果:
try...
ValueError:invalid literal for int() with base 10: 'a'
finally....
END
此外,如果错误没有发生,在except
语句块后面添加一个else
语句,当没有错误发生,就会执行else
语句:
try:
print('try...')
r=10/int('a')
print('result:{0}'.format(r)) #前面没有错误就执行这里
except ValueError as e: #捕捉到ValueError 就执行这段语句块
print("ValueError:{0}".format(e))
except ZeroDivisionError as e: #捕捉到ZeroDivisionError 就执行这段语句块
print("except:{0}".format(e))
else: #try语句块没有发生错误,就会执行else
print('no error')
finally:
print('finally....') #不管有没有错误,都会执行finally这一步
print('END')
记录错误
让python解析器打印出错误堆栈
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: #捕捉到错误
#print('Error:', e)
logging.exception(e) #打印错误堆栈
finally:
print('finally...')
main()
print('END')
同样是出错,但程序打印完错误信息后会继续执行,并正常退出:
finally... #代码执行
ERROR:root:division by zero #错误信息
END #代码执行
Traceback (most recent call last): #错误堆栈
File "E:/python/untitled/venv/demo6.py", line 16, in main
bar('0')
File "E:/python/untitled/venv/demo6.py", line 12, in bar
return foo(s) * 2
File "E:/python/untitled/venv/demo6.py", line 9, in foo
return 10 / int(s)
ZeroDivisionError: division by zero
抛出错误
def foo(s):
n = int(s)
if n==0:
raise ValueError('invalid value: %s' % s)
return 10 / n
def bar():
try:
foo('0')
except ValueError as e:
print('ValueError!')
raise
bar()
raise语句如果不带参数,就会把当前错误原样抛出