你能用python解释一下这个代码片段吗

你能用python解释一下这个代码片段吗,python,exception,exception-handling,Python,Exception,Exception Handling,我是python新手,需要一些帮助来理解此代码片段: for c in [B, C, D]: try: raise c() except D: print "D" except C: print "C" except B: print "B" 阅读python文档时,似乎raise()抛出了一个异常,但我不明白为什么raise()在try块中。是不是应该是这样的: try: //do something cat

我是python新手,需要一些帮助来理解此代码片段:

for c in [B, C, D]:
   try:
      raise c()
   except D:
      print "D"
    except C:
      print "C"
    except B:
      print "B"
阅读python文档时,似乎
raise()
抛出了一个异常,但我不明白为什么
raise()
try
块中。是不是应该是这样的:

try:
    //do something
catch:
    raise()

raise
是您首先引发异常的方式。异常处理程序中单独的
raise
只会将异常传播到外部处理程序。

该代码有点可笑,因为它是一种奇怪的处理方式,但很清楚发生了什么。列表
[B,C,D]
是一个例外列表。由于异常是
try
块中的
raise
d,因此它立即由相应的
except
处理程序处理(依次是
except B:
except C:
except d:
处理程序)

因此,该代码相当于:

print "B"
print "C"
print "D"
除了如果
B
C
D
中的任何一个不是异常,它将抛出一个(未捕获)异常。

我假定raise()直接放在try中:只是为了说明。
即使在正常情况下,您也会放入导致异常的代码(即包含raise()的代码)在try内部,不是吗?

在不知道代码应该完成什么的情况下,100%不可能知道哪个版本是正确的。哦,明白了。因此,try块中的代码本质上是根据
c
的值引发异常?它在
c
中引发异常类的实例。在Python中,一切都是如此g是一个对象,包括类本身。名称
c
依次绑定到每个类;
c()
每次通过循环创建一个对应异常类的实例,然后是
raise
d。是的,这有点可笑。它是基本python类的一部分,所以除了解释python中异常处理的概念之外,它实际上不应该实现任何功能。是的,你是对的。仔细考虑之后此外,我意识到在
try
块中引发异常是有意义的