Python的错误处理try...except...finally

捕获错误

try:
    #可能出错的代码
except 错误类型 as e:
    #出错进行的代码
else:
    #不出错才执行的代码
finally:
    #无论是否出错都要进行的代码

错误有很多类型,可以有多个except捕获错误:

try:
    #可能出错的代码
except 错误类型1 as e:
    #出错进行的代码1
except 错误类型3 as e:
    #出错进行的代码2
except 错误类型3 as e:
    #出错进行的代码3

Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。
Python常见的错误类型和继承关系

记录错误

使用logging模块,打印错误信息

import logging
try:
    10 / 0 
except ZeroDivisionError as e:
    logging.exception(e)
print("END")

运行结果:

ERROR:root:division by zero
Traceback (most recent call last):
  File "finally.py", line 3, in 
    10 / 0
ZeroDivisionError: division by zero
END

自定义错误

错误是一个class,可以选好继承关系自定义错误

#自定义一个FooError继承自ValueError
class FooError(ValueError):
    pass

抛出错误

#raise抛出错误
raise  错误类型

另一种错误处理方式

def foo(s):
    n = int(s)
    if n==0:
        raise ValueError('invalid value: %s' % s)
    return 10 / n

def bar():
    try:
        foo('0')
#错误捕获之后,仅仅记录了下来,然后用raise抛出    
except ValueError as e:
        print('ValueError!')
        raise

bar()

raise不带参数,会把错误原样抛出
except中raise一个Error,还可以把一种类型的错误转化成另一种类型:

try:
    10 / 0
except ZeroDivisionError:
    raise ValueError('input error!')

你可能感兴趣的:(Python的错误处理try...except...finally)