Python Try-Except在Function内部

gar*_*ren 3 python exception-handling exception try-catch

我对python的try-except子句有了很好的理解,但是当我试图把它放在一个函数中时遇到了问题.

>>> def tryAppend(child, parent):
...     try:
...             parent.append(child)
...     except NameError:
...             print "WRONG NAME"
>>> var1 = []
>>> var2 = 'test2'
>>> tryAppend(var2, var1)  #works, no error
>>> tryAppend(foo, var1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
Run Code Online (Sandbox Code Playgroud)

它几乎就像python没有看到try:语句.任何帮助表示赞赏.

小智 10

我对python的try-except子句有了很好的理解

不,嗯,也许你有,但那时你严重缺乏其他更重要的领域.要么你期望尝试(双关语不是)的范围神奇地扩展,要么你不明白代码被评估的顺序...我将假设后者.tryAppend(foo, var1)按此顺序评估(大致):

  1. 获取对象tryAppend引用
  2. 获取对象foo引用
  3. 获取对象var1引用
  4. 使用第二个和第三个作为参数调用第一个(=执行函数所做的任何tryAppend操作,不包括try-except)

错误发生在#2,早在函数和try块输入之前.实际上,try块不能抛出NameError,因为使用的唯一名称是,parent并且child都是参数,因此始终可用(如果.append不存在,则为a AttributeError).

你问为什么

raise Exception("Catch me if you can")
try:
    pass # do nothing
except:
    print "caught it"
Run Code Online (Sandbox Code Playgroud)

不打印"抓住它".


cab*_*nga 5

这与您的异常处理程序无关.您看到的错误是因为"foo"未在任何地方定义.


Jon*_*erg 5

名称错误发生在进入 tryAppend 之前。当尝试将 foo 传递给函数时,它会评估 foo 的值。这有效:

def tryAppend(child, parent):
    parent.append(child)

var1 = []
try:
    tryAppend(foo, var1)
except NameError:
    print 'WRONG NAME'
Run Code Online (Sandbox Code Playgroud)