繁体   English   中英

Python Try-Except 函数内部

[英]Python Try-Except inside of Function

我对 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: 语句一样。 任何帮助表示赞赏。

tryAppend(foo, var1) ) 按以下顺序(大致)评估:

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

错误发生在 #2,早在函数和 try 块被输入之前。 事实上, try 块不能抛出 NameError ,因为使用的唯一名称是parentchild ,两者都是参数,因此始终可用(如果.append不存在,那就是AttributeError )。

同样,下面的代码不会打印“caught it”,因为在 try 块执行之前引发了异常:

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

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

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

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

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

NameError 在名称 'foo' 被评估时被抛出,这是在进入函数之前。 因此函数中的 try/except 是不相关的。

对于正在寻找如何使用 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')

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

(这个问题的副本也在这里<\/a>和这里<\/a>)

在 Python 3 中,您可以通过将lambda 函数<\/a>传递给包含 try-except 的函数来避免此问题。 例如,第一个块将引发错误:

def trying_fn1(foo):
    try:
        print(foo)
    except ZeroDivisionError:
        print('Cannot divide a number by zero.')

trying_fn1(10/0)

Traceback (most recent call last):
    File "<stdin>", line 1, in <module> trying_fn1(10/0)
ZeroDivisionError: division by zero

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM