Python函数的内部除外
我对python的try-except子句有很好的理解,但在尝试将其放入函数中时遇到了问题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'
>>> 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)
父级
和子级
,这两个名称都是参数,因此总是可用的(如果.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
抛出一个名称错误。但这很愚蠢。