错误处理
在程序运行的过程中,如果发生了错误,可以实现约定一个错误代码,这样就可以知道是否有错,以及出错的原因,在操作系统的调用中,返回错误码的非常常见。因此,在高级语言通常都内置了一套try……except……finally……错误处理机制,Python业不例外。
#try的机制 try: print("try...") r = 10/0 print('result', r) except ZeroDivisionError as e: print("except:", e) finally: print("finally...") print("END")
错误应该有很多种类,如果发生了不同类型的错误,应该由不同的except语句块处理,但是Python的错误也是class,所有的错误类型都继承自BaseException,所以咋使用except时,需要注意的是,它不但捕获类型的错误,还把其他的子类业一网打尽。
调用栈
如果错误没有捕获,它就会一直向上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出
def foo(s): return 10/int(s) def bar(s): return foo(s)*2 def main(): bar('0') main()
出错的时候,一定要分析错误的调用栈的信息,这才能定位错误
记录错误
如果不捕获错误,自然可以让Python解释器来打印的错误堆栈,但是程序也被结束了,既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误的原因,同时让程序继续执行下去。
Python内置的logging模块可以非常容易的记录错误信息:
import logging def foo(s): return 10/int(s) def bar(s) return foo(s)*2 def mian(): try: bar('0') except Exception as e: logging.except(e) main() print("END")
同样是出错,但是程序打印完信息会继续执行,并且正常退出
抛出错误
因为错误class,捕获一个错误就是捕获到该class的一个实例,因此,错误并不是凭空产生的,而是有意创建并抛出的,Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误。