Python 为什么可以';我不能在排除异常之后调用异常吗?

Python 为什么可以';我不能在排除异常之后调用异常吗?,python,exception,scope,Python,Exception,Scope,为什么我不能在捕获异常类后引发异常实例?奇怪的是,我在从函数运行脚本时遇到了这个错误,而不是在python shell中直接运行脚本时 In [2]: def do(): ...: try: ...: raise ValueError('yofoo') ...: except TypeError, ValueError: ...: raise ValueError('yo') ...: In [3]: do() -

为什么我不能在捕获异常类后引发异常实例?奇怪的是,我在从函数运行脚本时遇到了这个错误,而不是在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
[2]中的
:def do():
…:试试看:
…:提升值错误('yofoo')
…:除TypeError、ValueError外:
…:提升值错误('yo')
...: 
在[3]:do()中
---------------------------------------------------------------------------
取消绑定LocalError回溯(最近一次调用上次)
在()
---->1 do()
在do()中
1 def do():
2.尝试:
---->3提高值错误(“yofoo”)
4除TypeError、ValueError外:
5提升值错误('yo')
UnboundLocalError:赋值前引用的局部变量“ValueError”
此处出现预期错误:

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
[3]中的
:尝试:
…:提升值错误(“foo”)
…:除值错误外:
…:提升值错误(“bar”)
...: 
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
2升值错误(“foo”)
3除值错误外:
---->4上升值错误(“bar”)
5.
值错误:bar
应该是

except (TypeError, ValueError):
当使用除TypeError、ValueError:之外的
时,将异常实例分配给变量名
ValueError

对于当前代码,当Python解析
do
函数时,它注意到
ValueError
是一个局部变量,因为
除了TypeError,ValueError:
ValueError
赋值。但是,当您在第一个
try-suite
中使用
raisevalueerror('yofoo')
引用它时,局部变量
ValueError
没有值。因此,您会得到
UnboundLocalError


发件人:

请注意,此元组周围的括号是必需的,因为 除了ValueError,e:语法是否用于通常编写的内容 除ValueError外,在现代Python中为e:。旧的 为了向后兼容,仍然支持语法。这意味着 除了RuntimeError,TypeError不等同于Exception (RuntimeError,TypeError):但除了RuntimeError作为TypeError之外: 这不是你想要的

except (TypeError, ValueError):
... except (RuntimeError, TypeError, NameError):
...     pass