• Python----面向对象---try....except的详细用法


    try..except...详细用法

    1、如果一段代码有多种类型的错误,例如:

     1 try:
     2     print('======1')
     3     name
     4     print('======2')
     5     l = [1, 2, 3]
     6     l[100]
     7     print('======3')
     8     d = {}
     9     d['name']
    10     print('======4')
    11 
    12 except NameError as e:
    13     print('---->', e)
    14 
    15 结果为:
    16 
    17 ======1
    18 ----> name 'name' is not defined

    定制什么类型异常,能捕获相应的异常,但是没有指定的异常的话还是会报错的,

     1 try:
     2     print('======1')
     3     # name
     4     print('======2')
     5     l = [1, 2, 3]
     6     l[100]
     7     print('======3')
     8     d = {}
     9     d['name']
    10     print('======4')
    11 
    12 except NameError as e:
    13     print('---->', e)
    14 
    15 结果为:
    16 
    17 ======1
    18 Traceback (most recent call last):
    19 ======2
    20   File "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/面向对象编程/33 try...except详细用法.py", line 8, in <module>
    21     l[100]
    22 IndexError: list index out of range

    这样的话,能不能写多个except呢,答案是可以的,这就是异常的多分支

     1 try:
     2     print('======1')
     3     # name
     4     print('======2')
     5     l = [1, 2, 3]
     6     # l[100]
     7     print('======3')
     8     d = {}
     9     d['name']
    10     print('======4')
    11 
    12 except NameError as e:
    13     print('---->', e)
    14 
    15 except IndexError as e:
    16     print('---->', e)
    17 
    18 except KeyError as e:
    19     print('---->', e)
    20 
    21 结果为:
    22 
    23 ======1
    24 ======2
    25 ======3
    26 ----> 'name'

    这样就能捕获多种类型的异常,

    多分支:被检测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型都定制专门的处理逻辑

     1 try:
     2     print('======1')
     3     # name
     4     print('======2')
     5     l = [1, 2, 3]
     6     # l[100]
     7     print('======3')
     8     d = {}
     9     d['name']
    10     print('======4')
    11 
    12 except NameError as e:
    13     print('---->', e)
    14 
    15 except IndexError as e:
    16     print('---->', e)
    17 
    18 except KeyError as e:
    19     print('---->', e)
    20 
    21 print('after code')
    22 
    23 结果为:
    24 
    25 ======1
    26 ======2
    27 ======3
    28 ----> 'name'
    29 after code

    捕获异常后的代码会正常执行,

    万能异常:Exception ,被检测的代码块抛出的异常有多种可能性,并且我们针对所有的异常类型都只用一种处理逻辑就可以了,那就使用Exception,

     1 try:
     2     print('======1')
     3     # name
     4     print('======2')
     5     l = [1, 2, 3]
     6     # l[100]
     7     print('======3')
     8     d = {}
     9     d['name']
    10     print('======4')
    11 
    12 except Exception as e:
    13     print('---->', e)
    14 
    15 
    16 print('after code')
    17 
    18 结果为:
    19 
    20  ======1
    21 ======2
    22 ======3
    23 ----> 'name'
    24 after code

    当然,万能异常也可以和定制异常混合使用,除了我们关心的异常使用定制异常,其它的异常类型我们使用万能异常

    代码示例如下:

     1 try:
     2     print('======1')
     3     name
     4     print('======2')
     5     l = [1, 2, 3]
     6     l[100]
     7     print('======3')
     8     d = {}
     9     d['name']
    10     print('======4')
    11 
    12 except NameError as e:
    13     print('---->', e)
    14 
    15 except IndexError as e:
    16     print('---->', e)
    17 
    18 except KeyError as e:
    19     print('---->', e)
    20 
    21 except Exception as e:
    22     print('---->', e)
    23 
    24 
    25 print('after code')
    26 
    27 结果为:
    28 
    29 ======1
    30 ----> name 'name' is not defined
    31 after code

     还可以在except后加else判断语句,该语句会在被检测的代码块没有发生异常时执行

    如:

     1 try:
     2     print('======1')
     3     # name
     4     print('======2')
     5     l = [1, 2, 3]
     6     # l[100]
     7     print('======3')
     8     d = {}
     9     # d['name']
    10     print('======4')
    11 
    12 except NameError as e:
    13     print('---->', e)
    14 
    15 except IndexError as e:
    16     print('---->', e)
    17 
    18 except KeyError as e:
    19     print('---->', e)
    20 
    21 except Exception as e:
    22     print('---->', e)
    23 
    24 else:
    25     print('在被检测代码块没有发生异常时执行')
    26 
    27 
    28 print('after code')
    29 
    30 结果为:
    31 
    32 ======1
    33 ======2
    34 ======3
    35 ======4
    36 在被检测代码块没有发生异常时执行
    37 after code

    加finally语句,不管被检测的代码块有没有发生异常都会执行

     1 try:
     2     print('======1')
     3     # name
     4     print('======2')
     5     l = [1, 2, 3]
     6     # l[100]
     7     print('======3')
     8     d = {}
     9     d['name']
    10     print('======4')
    11 
    12 except NameError as e:
    13     print('---->', e)
    14 
    15 except IndexError as e:
    16     print('---->', e)
    17 
    18 except KeyError as e:
    19     print('---->', e)
    20 
    21 except Exception as e:
    22     print('---->', e)
    23 
    24 else:
    25     print('在被检测代码块没有发生异常时执行')
    26 
    27 finally:
    28     print('不管被检测的代码块有没有发生异常都会执行')
    29 
    30 
    31 print('after code')
    32 
    33 结果为:
    34 
    35 
    36 ======1
    37 ======2
    38 ======3
    39 ----> 'name'
    40 不管被检测的代码块有没有发生异常都会执行
    41 after code

    finally的代码应用案例:

     1 try:
     2     f = open('a.txt')
     3     print(next(f))
     4     print(next(f))
     5     print(next(f))
     6     print(next(f))
     7     print(next(f))
     8     print(next(f))
     9     print(next(f))
    10 
    11 finally:
    12     print('final')
    13     f.close()
    14 
    15 结果为:
    16 
    17 111
    18 Traceback (most recent call last):
    19 
    20 222
    21 
    22 333
    23   File "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/面向对象编程/33 try...except详细用法.py", line 42, in <module>
    24 
    25 444
    26     print(next(f))
    27 
    28 StopIteration
    29 555
    30 final
  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/xudachen/p/8672352.html
Copyright © 2020-2023  润新知