为什么在我排除异常之后不能调用异常?

2024-09-29 23:15:01 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么在捕获异常类后不能引发异常实例?奇怪的是,当我从函数中运行脚本时,我会遇到这个错误,但在pythonshell中直接运行时却没有遇到。在

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

此处预期错误:

^{pr2}$

Tags: ininputdef错误ipythondoraiseyo
1条回答
网友
1楼 · 发布于 2024-09-29 23:15:01
except TypeError, ValueError:

应该是

^{pr2}$

使用except TypeError, ValueError:时,将异常实例分配给变量名ValueError。在

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


来自the docs

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

Note that the parentheses around this tuple are required, because except ValueError, e: was the syntax used for what is normally written as except ValueError as e: in modern Python (described below). The old syntax is still supported for backwards compatibility. This means except RuntimeError, TypeError is not equivalent to except (RuntimeError, TypeError): but to except RuntimeError as TypeError: which is not what you want.

相关问题 更多 >

    热门问题