除了它之外,为什么我不能在我之后调用异常?

You*_*cha 5 python scope exception

我捕获Exception类后为什么不能引发Exception实例?奇怪的是,当我从一个函数运行脚本时,我遇到了这个错误,但是直接在python shell中运行时没有.

In [2]: def do():
   ...:     try:
   ...:         raise ValueError('yofoo')
   ...:     except TypeError, ValueError:
   ...:         raise ValueError('yo')
   ...: 

In [3]: do()
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-3-30c46b84d9a4> in <module>()
----> 1 do()

<ipython-input-2-b62158d6343b> in do()
      1 def do():
      2     try:
----> 3         raise ValueError('yofoo')
      4     except TypeError, ValueError:
      5         raise ValueError('yo')

UnboundLocalError: local variable 'ValueError' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

这里预期的错误:

In [3]: try:
   ...:     raise ValueError("foo")
   ...: except ValueError:
   ...:     raise ValueError("bar")
   ...: 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-d5c83419a5ea> in <module>()
      2     raise ValueError("foo")
      3 except ValueError:
----> 4     raise ValueError("bar")
      5 

ValueError: bar
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 9

except TypeError, ValueError:
Run Code Online (Sandbox Code Playgroud)

应该

except (TypeError, ValueError):
Run Code Online (Sandbox Code Playgroud)

使用时except TypeError, ValueError:,您将Exception实例分配给变量名称ValueError.

使用当前代码,当Python解析do函数时,它注释ValueError是一个局部变量,因为except TypeError, ValueError:它赋值ValueError.但是当你在第一个中引用它try-suiteraise ValueError('yofoo'),局部变量ValueError没有值.所以你得到了UnboundLocalError.


来自文档:

... except (RuntimeError, TypeError, NameError):
...     pass
Run Code Online (Sandbox Code Playgroud)

请注意,这个元组周围的括号是必需的,因为除了ValueError之外,e:是用于正常写入的语法,除了ValueError之外,在现代Python中如下所述(如下所述).仍然支持旧语法以实现向后兼容性.这意味着除了RuntimeError之外,TypeError不等同于(RuntimeError,TypeError):但是除了RunErrorError之外还有TypeError:这不是你想要的.