2013-08-06 34 views
0

想象一下,您有一個函數,在某些錯誤情況下會給出異常並在一些返回中返回None(它不是由我設計的,我需要使用它)。現在,您需要處理這些錯誤,但以相同的方式(向用戶顯示消息,記錄並正常退出)。如何高效地捕獲異常並檢查參數是否無

我一直在做這樣的事情:

try: 
    result = weird_func() 
except: 
    *same functionality* do something here 

if not result: 
    *same functionality* do the same here as in the except block 

但它真的很可怕。有沒有辦法巧妙地將這兩個合成一個? 我一直在想使用try/finally沒有,除了它,但它看起來有點奇怪。

有什麼建議嗎?

+0

把'*相同的功能*'成一個函數,調用該函數在這兩個地方。 – SethMMorton

+0

通常,你的函數應該能夠處理任何類型的輸入,而不會產生錯誤。 –

+0

擁有一個「except」(通常是一個糟糕的主意)(有一些不尋常的特殊情況,例如,在subprocess中存在一個不尋常的特殊情況,但通常會捕獲您關心的異常,而不是每個可能的異常包括'KeyboardInterrupt'和'SystemExit'「)。 – torek

回答

5
try: 
    result = weird_func() 
except TheExceptionYouWantToCatch: 
    result = None 

if result is None: 
    #Whatever you want 
1

將結果設置爲None是一個選項。

try: 
    result = weird_func() 
except: 
    result = None 

if not result: 
    *same functinality* do the same here as in the except block 

或在try中引發異常。

try: 
    result = weird_func() 
    if not result: raise Exception() # or assert result 
except: 
    *same functinality* do something here 
+0

在你的第二個例子中,不應該是'如果不是結果:'? – SethMMorton

+0

@SethMMorton,謝謝你的評論。我修好了它。 – falsetru

0

或多或少什麼falsetru說:

result = wierd_func() 
assert result 

將提高任何原有的異常或一個AssertionError時,結果是無。只要任何封閉的try可以捕獲AssertionErrror以及任何其他的wierd_func,那麼你就很好。

爲了完整起見,這裏還有:

try: 
    return wierd_func() or RuntimeError() # or whatever you'd like to raise: 
except: 
    return sys.exc_info()[0] 

這將在一個錯誤的情況下總是返回一個異常對象,所以你可以做的復甦方式---但我不會理會: try/catch語句是用於處理錯誤條件,使添加斷言,然後處理所有異常在一個地方

0

我一般都用同樣的模式在Lennart Regebro的答案。對於一些特殊的情況下,與文件做特別具有的,我有時用一個稍微修改後的版本,像這樣:

to_close = None 
stream = None 
try: 
    to_close = open(path, mode) 
    stream = to_close 
    if validate_open_stream(stream): 
     to_close = None 
finally: 
    if to_close is not None: 
     to_close.close() 
     stream = None 
return stream 

這種特殊的序列讓我打開一個文件(這可能會提高IOError如果文件不能打開),然後以某種方式檢查它 - 確保它具有適當的「幻數」,然後返回打開的流以供進一步使用。如果在文件打開時出現問題,to_closefinally子句中不是None,我關閉了該流並確保返回None

(通常是一個上下文管理器更適合這個,我需要這種模式更適用於Python 2.4和更早版本。)