Exception,python的错误处理学习总结

2020年2月23日09:21:57 发表评论 78 views

高级语言都会使用内置的一套try...except...finally...的错误处理机制, 可以更高效的处理错误,

无需程序员自己写错误处理的代码。

try

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')
  • 如果有错误,根据发生不同类型的错误,使用不同的except处理。
    • int('a')会出发 ValueError
    • 10/0会触发ZeroDivisionError。
  • 否则代表没有错误,则执行else。
  • 最后都要执行finally

常见的错误类型和继承关系

看文档Built-in Exceptions

https://docs.python.org/3/library/exceptions.html#exception-hierarchy

try的好处

可以跨多层调用。函数main()调用bar(), bar调用foo(), 只要期间发生错误,try就会处理。

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        print('Error:', e)
    finally:
        print('finally...')

调用栈

如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序终止。

错误信息是Traceback (most recent call last)...。它是一个错误路径。可以在最后查看错误原因,定位错误位置。

logging模块

可以把错误信息记录到日志。并让程序继续执行。

# err_logging.pyimport logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        (e)

main()
print('END')

抛出错误

为错误是class,捕获一个错误就是捕获到该class的一个实例。所以,错误是根据情况故意创建的错误实例。

内置函数有各种类型的错误。也可以自己编写函数,然后抛出错误。

# err_raise.pyclass FooError(ValueError):
    passdef foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value: %s' % s)
    return 10 / n

foo('0')
  • 编写一个错误类FooError。
  • 用raise语句,生成FooError的实例。

尽量使用内置的函数。如ValueError, TypeError

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: