这是我参与更文挑战的第26天,活动详情查看: 更文挑战
错误处理机制try...except...finally...
这个的使用和 java 的 try-catch-finally
差不多,只是多了个else
来表示没有异常的时候,注意捕获的异常的类 要从子类到父类
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')
# 打印结果:
# try...
# result: 5.0
# no error!
# finally...
# END
复制代码
熟悉 Java 的小伙伴,是不是一眼就看出这个的不同呢,总感觉用 java 的这个 catch 会更清晰,而且可以写一个 catch 里,而这里得用很多 except 来表示不同的错误,不过这个 else 还是很突出 哈哈~
调用栈 & 记录错误
Python内置的
logging
模块可以非常容易地记录错误信息:
通过配置,logging
还可以把错误记录到日志文件里,方便事后排查。找bug的操作一般直接定位到最后那里就可以看到了
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')
# 打印结果:
# ERROR:root:division by zero
# Traceback (most recent call last):
# File "<ipython-input-5-cc27997fe30e>", line 11, in main
# bar('0')
# File "<ipython-input-5-cc27997fe30e>", line 7, in bar
# return foo(s) * 2
# File "<ipython-input-5-cc27997fe30e>", line 4, in foo
# return 10 / int(s)
# ZeroDivisionError: division by zero
# END
复制代码
这个日志感觉也没啥特别~ 毕竟大家都是日志 ?
抛出错误
这个和java抛出异常的操作也一样(只是java里Error是没法捕获的,一般是虚拟机或系统的Error如OutOfMemoryError。异常是可以解决的,如RuntimeException等等)。
下级决定不了的Error就抛给上级,用raise
语句抛出错误
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!')
print(e)
bar()
复制代码
这里还是有点不同的,这个错误居然还可以再往上抛~
最后
欢迎小伙伴们来一起探讨问题~
如果你觉得本篇文章还不错的话,那拜托再点点赞支持一下呀?
让我们开始这一场意外的相遇吧!~
欢迎留言!谢谢支持!ヾ(≧▽≦*)o 冲冲冲!!
我是4ye 咱们下期应该……很快再见!! ?
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END