LEEFEI571 发表于 5 天前

try...except嵌套的问题

各位大神,小甲鱼老师的课后例题有以下这道try...except的题:

import time
   
try:
    for i in reversed(range(1, 4)):
      print(i)
      time.sleep(1)
    try:
      520 + "FishC"
    except:
      print("内部异常~")
except:
    print("外部异常~")

我的困惑是当内部try...except中捕捉到了异常并执行except语句内容,为什么外部try...except语句不认定内部异常?也就是说不执行外部except语句中的内容?

FishC 发表于 5 天前


各位大神,小甲鱼老师的课后例题有以下这道try...except的题:

import time
   
try:
    for i in reversed(range(1, 4)):
      print(i)
      time.sleep(1)
    try:
      520 + "FishC"
    except:
      print("内部异常~")
except:
    print("外部异常~")

我的困惑是当内部try...except中捕捉到了异常并执行except语句内容,为什么外部try...except语句不认定内部异常?也就是说不执行外部except语句中的内容?


你的困惑在于不理解异常在嵌套 try...except 中的传播方式。简单来说,当内部 except 成功捕获并处理了异常后,该异常就被“消化”了,不会继续向外层传播。因此,外部 try 块认为没有未处理的异常,所以外部 except 不会执行。

具体分析代码执行流程:
1. 外部 try 块开始执行。
2. for 循环正常执行,打印 3、2、1,每次暂停1秒。
3. 循环结束后,执行内部 try 块。
4. 内部 try 块中的代码 520 + "FishC" 会引发 TypeError(整数和字符串不能相加)。
5. 内部 except 立即捕获这个异常,并打印“内部异常~”。
6. 异常被内部处理完毕后,程序继续执行外部 try 块的剩余部分。由于内部没有重新引发异常,外部 try 块正常结束。
7. 因此,外部 except 没有机会执行。

关键点:在 Python 中,异常一旦被某个 except 捕获并处理,除非显式地使用 raise 重新引发,否则异常链就会终止。你的代码中内部 except 没有使用 raise,所以外部感知不到异常。

如果你想同时触发外部异常,可以在内部 except 中重新引发异常,例如:
import time
   
try:
    for i in reversed(range(1, 4)):
      print(i)
      time.sleep(1)
    try:
      520 + "FishC"
    except:
      print("内部异常~")
      raise# 重新引发当前异常,让外层捕获
except:
    print("外部异常~")
这样就会先打印“内部异常~”,再打印“外部异常~”。

希望这个解释能帮你理解!如果还有其他问题,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

player-none 发表于 5 天前

因为你说的“内部异常”其实是“内部的内部的异常”,该异常已被内部 try-except 解决。所以【内部】会被判定为没有异常。
页: [1]
查看完整版本: try...except嵌套的问题