我对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
它几乎就像python没有看到try:语句。任何帮助表示赞赏。
答案 0 :(得分:9)
我对python的try-except子句
有了很好的理解
没有。好吧,也许你有,但后来你严重缺乏其他更重要的领域。要么你期望尝试(双关语不是)的范围神奇地扩展,要么你不明白代码被评估的顺序...我将假设后者。 tryAppend(foo, var1)
按此顺序进行评估:
tryAppend
引用foo
引用var1
引用tryAppend
执行的操作,不包括try-except)错误发生在#2,早在输入函数和try块之前。实际上,try块不能来抛出NameError,因为使用的唯一名称是parent
和child
,它们都是参数,因此始终可用(如果{{1} }不存在,那是.append
)。
你问为什么
AttributeError
不打印“抓住它”。
答案 1 :(得分:5)
这与您的异常处理程序无关。您看到的错误是因为“foo”未在任何地方定义。
答案 2 :(得分:4)
名称错误在进入tryAppend之前发生。它在尝试将foo传递给函数时评估foo的值。这有效:
def tryAppend(child, parent):
parent.append(child)
var1 = []
try:
tryAppend(foo, var1)
except NameError:
print 'WRONG NAME'
答案 3 :(得分:2)
在评估名称'foo'时抛出NameError,这是在进入函数之前。因此,函数中的try / except不相关。
答案 4 :(得分:1)
对于正在寻找如何使用try除了函数内部的构造的人。 我不确定它是否是一种好的编程风格,但它确实有用。
您可以将字符串参数放入函数中。它将被正确评估,然后您可以在函数内使用exec
:
def tryAppend(child, parent):
try:
script = parent + '.append(' + child + ')'
exec script
return parent
except NameError:
print "WRONG NAME"
var1 = []
var2 = 'test2'
tryAppend('var2', 'var1')
tryAppend('foo', 'var1')
答案 5 :(得分:0)
foo
之前,即函数之外,也会发生 tryAppend()
异常。