Python函数的内部除外

Python函数的内部除外,python,exception,exception-handling,try-catch,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'

我对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
def tryAppend(子项、父项): ... 尝试: ... 父项追加(子项) ... 除名称错误外: ... 打印“错误的名称” >>>var1=[] >>>var2='test2' >>>tryAppend(var2,var1)#有效,无错误 >>>tryAppend(foo,var1) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 NameError:未定义名称“foo”
这几乎就像python没有看到try:语句一样。非常感谢您的帮助。

这与您的异常处理程序无关。您看到的错误是因为“foo”没有在任何地方定义。

名称错误发生在它进入tryAppend之前。当试图将foo的值传递给函数时,它会计算foo的值。这项工作:

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

var1 = []
try:
    tryAppend(foo, var1)
except NameError:
    print 'WRONG NAME'

在输入函数之前计算名称“foo”时,会引发NameError。因此,函数内的try/except是不相关的。

foo
异常甚至在您输入函数
tryAppend()
之前发生,即在函数外部。

tryAppend(foo,var1)
按以下顺序(大致)计算:

>>> 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
  • 获取对象
    tryAppend
    引用
  • 获取对象
    foo
    引用
  • 获取对象
    var1
    引用
  • 使用第二个和第三个参数调用第一个(=执行函数
    tryAppend所做的任何操作,取消try except)
  • 该错误发生在#2,在函数和try块输入之前很久。事实上,try块不能抛出名称错误,因为只使用了
    父级
    子级
    ,这两个名称都是参数,因此总是可用的(如果
    .append
    不存在,这就是
    属性错误

    同样,以下代码不会打印“捕获它”,因为在执行try块之前引发了异常:

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

    对于正在寻找如何使用函数内部的try-except构造的人。 我不确定这是否是一种好的编程风格,但它确实有效

    可以将字符串参数放入函数中。它将被正确评估,然后您可以在函数内部使用
    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')
    

    谢谢你,乔纳森。我不认为这是评估变量的过程。这样就不可能将未定义的变量传递到函数中,对吗?只是尽量使代码干净……如果要将“undefined”变量传递到函数中,可以尝试传入locals()。@garen:只是不要编写引起NameErrors的代码。请确保在所有代码路径中始终为它们分配了一些(合理的!)值,或者在出现不允许继续(有意义地)的状态时提前终止并发出有意义的错误消息。var2是字符串“test2”的命名空间。如果要输入字符串“foo”,则必须将其封装在“”或“”中,否则,如果在程序的其他任何地方没有将foo定义为函数或类或其他任何内容,则它将不起作用。您基本上是在声明名称空间之前尝试使用名称空间。我是一个非常挑剔的人,我想说try块可能会引发名称错误,比如if
    parent.append
    抛出一个名称错误。但这很愚蠢。