|
|
各位大神,小甲鱼老师的课后例题有以下这道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 小助理,如未能正确解答您的问题,请继续追问。 |
|