为什么我在捕获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
答案 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: 这不是你想要的。