try-except-else-finally

发布时间 2023-07-22 11:26:54作者: Allen_Hao
 1 '''
 2 1. 语法:
 3     try:
 4         # 可能引发异常的代码
 5     except ExceptionType1:
 6         # 处理异常类型1的代码
 7     except ExceptionType2:
 8         # 处理异常类型2的代码
 9     else:
10         # 如果没有发生异常,执行此处的代码
11     finally:
12         # 无论是否发生异常,都会执行此处的代码
13 
14     1. 日常工作中,每次处理异常时都要尽可能把except、else、finally语句写全了。
15     2. try块包含了可能引发异常的代码。如果在try块中引发了一个异常,则会转到相应的except块进行异常处理。可以有多个except块来处理不同类型的异常。
16     3. else块是可选的,只有当没有发生任何异常时才会执行其中的代码。
17     4. finally块也是可选的,无论是否发生异常,都会执行其中的代码。通常在这里进行清理工作,如关闭文件或释放资源。
18 
19 2. 最佳实践值得考虑:
20     1. 精确捕获异常:根据具体情况捕获特定类型的异常,而不是简单地使用通用的Exception。这有助于提供更准确的错误处理。
21     2. 使用else块进行干净的逻辑:将没有异常的逻辑放在else块中,以使代码更清晰和易读。
22     3. 利用finally块进行资源清理:在finally块中执行必要的资源清理操作,以确保资源的正确释放。
23 
24 3. 在try-except-else-finally结构中,代码的执行顺序如下:
25     1. 首先,程序执行try块中的代码。
26     2. 如果在try块中没有引发异常,则跳过所有的except块,直接执行else块中的代码。注意,只有当没有任何异常时才会执行else块。
27     3. 如果在try块中引发了一个异常,并且该异常与某个except块中指定的异常类型匹配,则执行对应的except块中的代码。只会执行与第一个匹配的异常类型相对应的except块,其他的except块将被忽略。
28     4. 无论是否发生异常,最后都会执行finally块中的代码。finally块中的代码始终会被执行,无论之前是否有异常发生。
29 
30 总结起来,try块中的代码始终会被执行。如果没有异常发生,那么会继续执行else块中的代码。如果发生了异常并匹配到相应的except块,那么会执行该except块中的代码。最后,不管是否发生异常,都会执行finally块中的代码。
31 
32 需要注意的是,在执行完finally块中的代码后,异常(如果有)仍然会向上层传播,除非在finally块中使用了return、break或continue等中断语句。
33 '''
34 
35 try:
36     num1 = int(input("请输入一个整数: "))
37     num2 = int(input("请输入另一个整数: "))
38     result = num1 / num2
39 except ValueError:
40     print("输入无效的整数")
41 except ZeroDivisionError:
42     print("除数不能为零")
43 else:
44     print("结果:", result)
45 finally:
46     print("程序执行完毕")
 1 # 要注意的是,在执行完finally块中的代码后,异常(如果有,并且没有捕获)仍然会向上层传播,除非在finally块中使用了return、break或continue等中断语句
 2 def divide(a, b):
 3     try:
 4         result = a / b
 5         return result
 6     # except ZeroDivisionError:  # 捕获处理了,就不会往外抛了
 7     #     print("除数不能为零")
 8     except TypeError:
 9         print("类型错误")
10     finally:
11         print("执行finally块")
12         # 因为没有捕获ZeroDivisionError,当发生了此异常,可通过return、break或continue中断向上层传播
13         return "执行了finally块的返回值"  # 如果注释此句,第19行的语句print("捕获到异常:", e)会被执行
14 
15 
16 try:
17     res = divide(10, 0)
18 except Exception as e:
19     print("捕获到异常:", e)  # 如果divide函数没有吃掉异常,此处就会捕获到异常: division by zero