try/except/finally

Python也不例外,跟其余高级语言同样,内置了一套try...except...finally...的错误处理机制
当认为某些代码可能会出错时,就能够用try来运行这段代码html

使用try时,要么except和finally至少要有一个存在,不然会没法经过编译python

捕获异常的意义在于,能够阻止程序意外停止,或以预想的方式停止,若是不捕获异常,错误会被解释器捕获,那么程序也就停止了函数

 

try...except...finally...机制spa

  若是执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块
  若是有finally语句块,执行完except后,则执行finally语句块,至此,执行完毕
  无论有没有报错,finally下的语句都必定会被执行code

    try:
        ......
    except ZeroDivisionError as e:
        print('except:', e)
    finally:
        print('finally...')

 

错误的继承htm

  Python的错误其实也是class,全部的错误类型都继承自BaseException
  因此在使用except时须要注意的是,它不但捕获该类对应的错误,还会捕获其子类对应的错误

  好比AError是BError的父类,若是except AError在先,except BError在后,
  但若错误被except AError捕获,且该错误也属于BError,则该错误不会被except BError所捕获blog

  Python全部的错误都是从BaseException类派生的
  常见的错误类型和继承关系请参照连接:https://docs.python.org/3/library/exceptions.html#exception-hierarchy继承

    try:
        ......
    except ValueError as e:
        print('ValueError')
    except UnicodeError as e: 
    #第二个except永远也捕获不到UnicodeError,由于UnicodeError是ValueError的子类,若是有,也被第一个except给捕获了
        print('UnicodeError')

 

跨越多层调用io

  使用try...except捕获错误还有一个巨大的好处,就是能够跨越多层调用
  好比函数main()调用bar(),bar()调用foo(),若是foo()出错,则只要main()捕获便可
  无需在每一个可能出错的地方去捕获错误,只要在合适的层次去捕获错误便可,所以大大减小了写try...except...finally的麻烦编译

    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...')
本站公众号
   欢迎关注本站公众号,获取更多信息