错误处理机制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() 复制代码
这里还是有点不同的,这个错误居然还可以再往上抛~