Python异常处理
Python错误处理
Python中的错误处理机制与Java类似,内置了一套try...except...finally...
错误处理机制
try:
print('tyr...')
r = 10 / 0
print('result', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
tyr...
except: division by zero
finally...
END
Python中所有Exception的派生关系,参考官方文档 https://docs.python.org/3/library/exceptions.html#exception-hierarchy
错误捕获的一个巨大好处就是可以跨越多层调用。
调用栈
分析调用栈信息,找到错误信息
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-2-189c120ae7d8> in <module>
8 bar('0')
9
---> 10 main()
<ipython-input-2-189c120ae7d8> in main()
6
7 def main():
----> 8 bar('0')
9
10 main()
<ipython-input-2-189c120ae7d8> in bar(s)
3
4 def bar(s):
----> 5 return foo(s) * 2
6
7 def main():
<ipython-input-2-189c120ae7d8> in foo(s)
1 def foo(s):
----> 2 return 10 / int(s)
3
4 def bar(s):
5 return foo(s) * 2
ZeroDivisionError: division by zero
记录错误
如果不捕获错误,自然可以让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:
logging.exception(e)
main()
print('END')
ERROR:root:division by zero
Traceback (most recent call last):
File "<ipython-input-3-cc27997fe30e>", line 11, in main
bar('0')
File "<ipython-input-3-cc27997fe30e>", line 7, in bar
return foo(s) * 2
File "<ipython-input-3-cc27997fe30e>", line 4, in foo
return 10 / int(s)
ZeroDivisionError: division by zero
END
程序把错误信息打印出来后继续运行直到结束。
通过配置,logging
还可以把错误信息记录到日志文件中,方便事后排查。
抛出错误
raise
语句抛出错误,类似于Java中的throw new Exception('...');