【问题标题】:Python Try-Except inside of FunctionPython Try-Except 函数内部
【发布时间】:2011-05-08 01:48:04
【问题描述】:

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

【问题讨论】:

  • var2 是字符串“test2”的命名空间。如果要输入字符串'foo',则必须将其封装在''或“”中,否则,如果在程序中的其他任何地方都没有将foo定义为函数或类或其他任何东西,则它不起作用。您基本上是在声明命名空间之前尝试使用它。

标签: python exception exception-handling try-catch


【解决方案1】:

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"

【讨论】:

  • 我是一个非常挑剔的人,我想说 try 块可能会引发名称错误,比如 parent.append 是否抛出了一个错误。但这很愚蠢=)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    名称错误在进入 tryAppend 之前就发生了。它在尝试将其传递给函数时评估 foo 的值。这有效:

    def tryAppend(child, parent):
        parent.append(child)
    
    var1 = []
    try:
        tryAppend(foo, var1)
    except NameError:
        print 'WRONG NAME'
    

    【讨论】:

    • 谢谢乔纳森。我并不是说这是评估变量的过程。所以这使得将未定义的变量传递给函数是不可能的,对吧?只是试图使代码尽可能干净......
    • 如果你想将“未定义”变量传递给函数,你可以尝试传入 locals() 来代替。
    • @garen:只是不要编写引发 NameErrors 的代码。确保在所有代码路径中始终为它们分配一些(明智的!)值,或者当您最终处于不允许您继续的状态(有意义地)。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2019-06-26
          • 2011-01-22
          • 2016-10-31
          • 2014-11-15
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 2018-03-19
          相关资源
          最近更新 更多