2017-09-22 41 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)) 
相關問題