【发布时间】:2018-10-19 10:45:46
【问题描述】:
我对 python 异常有疑问。 下面的代码取自python文档,我一度感到困惑。如果有人可以提供帮助,将不胜感激。 这里代码给出的输出为:
B C D
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
如果我更改了以下代码以外的部分代码: 输出将是:
B B B
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except B:
print("B")
except C:
print("C")
except D:
print("D")
当我在没有 try 块的情况下运行此代码时,如下所示:
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
raise cls()
这里的输出是:
Traceback (most recent call last):
File "C:/Users/885710/Documents/PY/ErrorHandling.py", line 12, in <module>
raise cls()
B
以下代码类似:
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [C,B, D]:
raise cls()
输出是这个
Traceback (most recent call last):
File "C:/Users/885710/Documents/PY/ErrorHandling.py", line 12, in <module>
raise cls()
C
我很困惑,因为如果我单独运行此代码,那么它会输出 B 或 C 或 D 那么为什么在我的第二个代码 sn-p 中输出为
B
B
B
尽管为所有 3 个 B、C、D 类定义了 except
【问题讨论】:
-
C 是 B, D 是 C(又是B),所以(传递性地)D is B(这就是继承的全部意义)。您尝试处理异常的顺序 很重要(在这种情况下)。可能您应该从 Exception 扩展所有类(而不是像现在一样从另一个类扩展),并且您会在第二个 sn 中获得所需的行为-p(不改变其他场景)。
class C(Exception):,class D(Exception):. -
也许你应该从 Exception 扩展你所有的类>>你能用例子解释一下吗?
-
如果 D 是 C,C 是 B,因此 D 是 B,那么为什么它在第一个 sn-p 中打印 B,C,D 而在第二个中打印 B,B,B。还是没看懂
-
因为 is 只有一种方式:C is B,但 B 不是 C.
-
好的,谢谢你.. 明白了。
标签: python python-3.x exception-handling