2017-09-22 16 views
1

函数a()和b()会抛出异常。如何正确地省略UnboundLocalError:在抛出异常时赋值之前引用的局部变量“'?

def foo(): 
    try: 
     x = a('test') 
     b(x, 'test2') 
    except Exception as ex: 
     raise Exception('Message error: ' + str(x) + " " + str(ex)) #here could be UnboundLocalError: Local variable 'x' referenced before assignment 

我的解决办法是: 代码:“赋值之前引用局部变量‘X’UnboundLocalError”,而例外的是分配期间抛出这个代码不处理

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)) 

是否有可能做它更棘手,优雅?现在我不得不使用除模板外的双重尝试。

+0

为什么你需要首先引用'x'异常消息? – roganjosh

+0

此外,将第一个块中的两个函数捆绑到一个全部例外中并不是一个好主意(或者一般情况下使用一个“except”)。 'x = a('test')'失败还是'b(x,'test2')'?目前,你解密的方式是提出另一个未被捕获的异常。 – roganjosh

回答

0

这可能是你可以做的一种方式:

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)) 

就个人而言,我觉得赶上在单独尝试两种例外/ except块是更优雅,因为它表明,()未成功的读者完整,不允许一个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()https://docs.python.org/3/library/functions.html#locals

+1

但是流程的逻辑没有意义。如果'x = a('test')'失败,那么'b(x,'test2')'显然是不可能的,那么为什么它在同一个'try'中呢?只有两个单独的'try' /'except',每个都有一个,并且已经完成了。没有什么花哨或pythonic像这样的例外嵌套... – roganjosh

+1

你说得对,我不清楚我的回应。这就是我所说的“抓住两个例外”。虽然,那么甚至不会引发UnboundLocalError。用更好的策略编辑。 – Mario

+1

好得多:)看起来不如嵌套更令人印象深刻,但使得更多的意义! – roganjosh

0

您可以使用else条款[Python]: The try statement

def foo(): 
    try: 
     x = a("test") 
    except Exception as ex: 
     raise Exception("Message error (a): " + str(ex)) 
    else: 
     try: 
      b(x, "test2") 
     except Exception as ex: 
      raise Exception("Message error (b): " + str(x) + " " + str(ex)) 
相关问题