Python 如何正确使用ommit UnboundLocalError:局部变量'';在引发异常时在赋值之前引用?

Python 如何正确使用ommit UnboundLocalError:局部变量'';在引发异常时在赋值之前引用?,python,exception,try-catch,Python,Exception,Try Catch,函数a()和b()可以引发异常。在赋值“UnboundLocalError:赋值前引用的局部变量“x”期间引发异常时,此代码不处理 代码: 我的解决办法是: def foo(): try: x = a('test') try: b(x, 'test2') except Exception as ex: raise Exception('Message error: ' + str(x) + "

函数a()和b()可以引发异常。在赋值“UnboundLocalError:赋值前引用的局部变量“x”期间引发异常时,此代码不处理 代码:

我的解决办法是:

def foo():
    try:
        x = a('test')
        try:
            b(x, 'test2')
        except Exception as ex:
            raise Exception('Message error: ' + str(x) + " " + str(ex))         
    except Exception as ex:
        raise Exception('Message error: ' + str(ex))

有可能做得更巧妙、更优雅吗?现在我不得不使用double try Exception template。

这可能是一种方法:

try:
    x = a('test')
    b(x, 'test2')
except Exception as ex:
    if not 'x' in locals():
        x = 'undefined'
    raise Exception('Message error: ' + str(x) + " " + str(ex))
就个人而言,我认为在单独的try/except块中捕获这两个异常更为优雅,因为它向读者显示a()没有成功完成,并且不允许出现UnboundLocalError,这掩盖了真正的问题:

try:
    x = a('test')
except Exception as ex:
   raise Exception('oh no, a() failed')
try:
    b(x, 'test2')
except Exception as ex:
    raise Exception('oops, b() failed')

下面是一些关于
locals()

的文档,这可能是一种方法:

try:
    x = a('test')
    b(x, 'test2')
except Exception as ex:
    if not 'x' in locals():
        x = 'undefined'
    raise Exception('Message error: ' + str(x) + " " + str(ex))
就个人而言,我认为在单独的try/except块中捕获这两个异常更为优雅,因为它向读者显示a()没有成功完成,并且不允许出现UnboundLocalError,这掩盖了真正的问题:

try:
    x = a('test')
except Exception as ex:
   raise Exception('oh no, a() failed')
try:
    b(x, 'test2')
except Exception as ex:
    raise Exception('oops, b() failed')

以下是一些关于
locals()
的文档:

您可以使用以下的
else
子句:


您可以使用以下内容的
else
子句:


为什么您首先需要在异常消息中引用
x
?另外,将两个函数捆绑到一个catch-all异常中并不是一个好主意,就像您在第一个块中所希望的那样(或者通常使用一个覆盖的
,除了
)。是
x=a('test')
失败还是
b(x,'test2')
?目前,您的破译方法是引发另一个未捕获的异常。为什么您首先需要在异常消息中引用
x
?此外,将两个函数捆绑到一个catch-all异常中也不是一个好主意,就像您在第一个块中希望的那样(或者通常使用一个覆盖的
except
)。是
x=a('test')
失败还是
b(x,'test2')
?目前,你破译它的方式是引发另一个未被破坏的异常。但是流的逻辑没有意义。如果
x=a('test')
失败,那么
b(x,'test2')
显然是不可能的,那么为什么要在相同的
中尝试
?只要有两个独立的
试一下
/
,除了
,每个一个,然后完成。像这样嵌套异常并没有什么新奇或不切实际的…你是对的,我的回答不清楚。这就是我所说的“捕获两个异常”的意思。尽管如此,甚至不会引发UnboundLocalError。使用更好的策略进行编辑。更好:)看起来没有嵌套那么令人印象深刻,但更有意义!不,您应该使用
尝试。。。除了else
子句。这也有效。然后你仍然有一些看起来像嵌套的异常,海报试图避免这些异常,但是流的逻辑没有意义。如果
x=a('test')
失败,那么
b(x,'test2')
显然是不可能的,那么为什么要在相同的
中尝试
?只要有两个独立的
试一下
/
,除了
,每个一个,然后完成。像这样嵌套异常并没有什么新奇或不切实际的…你是对的,我的回答不清楚。这就是我所说的“捕获两个异常”的意思。尽管如此,甚至不会引发UnboundLocalError。使用更好的策略进行编辑。更好:)看起来没有嵌套那么令人印象深刻,但更有意义!不,您应该使用
尝试。。。除了else
子句。这也有效。然而,你仍然有一些看起来像嵌套异常的东西,这是海报试图避免的。