程序在执行过程中不可能一直一帆风顺,可能是由于程序员的疏忽出现程序设计问题或者是使用者没有按照规范执行程序,当发生异常的时候程序会停止执行并抛出异常,在控制台自动打印出异常信息。或者通过异常捕获机制捕获异常让程序继续执行下去,Python提供了try···except···else···finally···的错误处理机制,else中的内容是当try成功执行(无异常)时奖励执行的,而finally是无论如何都会执行的,但这两者都不是必要结构,该结构可以嵌套构建。
except后面没有加异常类型信息的时候就是对任何异常都进行捕获并处理,而有时需要针对不同的异常执行下一步操作,这时候可以设定异常类型并且设置多个except依次拦截。在Python中异常也是对象也存在有子父间关系,当异常抛出时需要有对应的exception类型来捕获,否则会持续向上抛出到调用函数,看看调用函数是否有相应的exception来捕获,到最后都没有的话依旧会导致程序停止,在控制台打印出信息。BaseException是所有异常类型的父类,所以except不指定异常信息等价于指定BaseException类型,对所有的异常均可以捕获。
异常类型的关系
def foo(s):
n = int(s)
try:
if n == 0:
raise ValueError('invalid value: %s' % s)
except KeyError:
print('KeyError!')
return 10 / n
def bar():
try:
foo('0')
except ValueError:
print('ValueError!')
bar()
logging模块的exception方法可以打印出异常信息。
import logging
def foo(s):
n = int(s)
try:
if n == 0:
raise ValueError('invalid value: %s' % s)
except KeyError:
print('KeyError!')
except BaseException as e:
print("终极拦截")
logging.exception(e)
print("继续执行")
return 10
def bar():
try:
foo('0')
except ValueError:
print('ValueError!')
bar()
结果为:
终极拦截
>ERROR:root:invalid value: 0
>Traceback (most recent call last):
File "<ipython-input-26-32c1733ed41b>", line 6, in foo
raise ValueError('invalid value: %s' % s)
ValueError: invalid value: 0
>继续执行
网友评论