为什么除了它之外我不能称之为例外?

时间:2014-03-11 17:48:17

标签: python exception scope

为什么我在捕获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

此处出现预期错误:

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

1 个答案:

答案 0 :(得分:9)

except TypeError, ValueError:

应该是

except (TypeError, ValueError):

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

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


来自the docs

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

请注意,此元组周围的括号是必需的,因为   除了ValueError,e:是用于正常编写的语法   在现代Python(如下所述)中,将ValueError作为e:除外。老人   仍支持语法以实现向后兼容性。这意味着   除RuntimeError外,TypeError不等于except   (RuntimeError,TypeError):但是除了RunErrorError以外的TypeError:   这不是你想要的。