Python Try-Except在Function内部

时间:2010-11-10 19:01:40

标签: python exception exception-handling 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

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

6 个答案:

答案 0 :(得分:9)

  

我对python的try-except子句

有了很好的理解

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

  1. 获取对象tryAppend引用
  2. 获取对象foo引用
  3. 获取对象var1引用
  4. 使用第二个和第三个作为参数调用第一个(=执行函数tryAppend执行的操作,不包括try-except)
  5. 错误发生在#2,早在输入函数和try块之前。实际上,try块不能来抛出NameError,因为使用的唯一名称是parentchild,它们都是参数,因此始终可用(如果{{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()异常。