2012-06-14 121 views
1

在我的應用程序中,我從文件中加載一些數據。這可能會失敗並引發異常。因此,我想記錄警告並繼續加載下一個數據。Python:如何在異常停止後繼續執行try語句

我正在做這樣的:

try: 
    data_A = getDefaultConf(param_1,param_2) 
except Exception as e: 
    log(WARNING, "Failed to get default parametres: "+str(e)) 
try: 
    data_B = getDefaultConf(param_1,param_3) 
except Exception as e: 
    log(WARNING, "Failed to get default parametres: "+str(e)) 
try: 
    data_C = getDefaultConf(param_4,param_5) 
except Exception as e: 
    log(WARNING, "Failed to get default parametres: "+str(e)) 
try: 
    data_D = getDefaultConf(param_4,param_6) 
except Exception as e: 
    log(WARNING, "Failed to get default parametres: "+str(e)) 
try: 
    data_E = getDefaultConf(param_4,param_7) 
except Exception as e: 
    log(WARNING, "Failed to get default parametres: "+str(e)) 

它的工作原理,但看起來很重。所以,我的問題是:它是否存在一種更輕的方法? 這可能是一些那樣工作:

try: 
    data_A = getDefaultConf(param_1,param_2) 
    data_B = getDefaultConf(param_1,param_3) 
    data_C = getDefaultConf(param_4,param_5) 
    data_D = getDefaultConf(param_4,param_6) 
    data_E = getDefaultConf(param_4,param_7) 
except Exception as e: 
    log(WARNING, "Failed to get default parametres: "+str(e)) 
    # Here something that could work like a "continue" statement so that if loading of 
    # data_2 fails it will store the log and continue by trying to load data_3, etc. 

我見過的其他職位建議把它的循環,但一些答案,豈不是更重來管理我的參數應用?

我以這種方式等待任何建議。無論我的代碼是如何工作的。所以,這只是一個問題的好奇心,也可以幫助其他程序員......

+0

*重*和*輕*甚至是什麼意思? –

+1

@Klaus Byskov Hoffmann:想象一下,如果數據量增長......在我的第一個例子中有很長的重複!對不起,但我不知道如何用英語中更好的單詞來解釋它(可能是單調乏味或令人厭煩) – VGO

+0

好吧,我現在明白了。 –

回答

5

在這種情況下,我可能會引入一個新功能(假設您不能或不想更改現有的getDefaultConf) :

def getDefault(x, y): 
    try: 
     return getDefaultConf(x,y) 
    except Exception as e: 
     log(WARNING, "Failed to get default parametres: "+str(e)) 
    return None 

data_A = getDefault(param_1,param_2) 
data_B = getDefault(param_1,param_3) 
data_C = getDefault(param_4,param_5) 
data_D = getDefault(param_4,param_6) 
data_E = getDefault(param_4,param_7) 

唯一這裏的區別是,你會得到None回導致的異常呼叫。這可能會或可能不會被您的應用程序接受。

+0

-1,因爲您只是在不考慮如何改進原始代碼的情況下解決了問題。使用枚舉變量名稱總是表示使用容器。請參閱@ shawn-chin的答案,看看它的樣子。 – schlamar

+4

我不認爲我們知道這是* actual *代碼,還是這是一個帶有一堆佔位符變量名稱的示例。我假設後者。無論如何,OP沒有詢問數據表示,問題是關於異常處理。我保持代碼的一般結構相同,所以使用容器等其他更改不會掩蓋我的觀點。 –

+0

無論如何,變量和參數之間存在映射關係。所以合乎邏輯的一步是實際使用一個。 – schlamar

1

把你的嘗試,除了在方法內。這將做到這一點。

def getDefaultConf(param_1,param_2): 
    try: 
     #code 
    except Exception as e: 
     log(WARNING, "Failed to get default parametres: "+str(e)) 
+0

@KlausByskovHoffmann無論如何,如果在例外後只發出警告,還需要進行其他檢查。 – moooeeeep

+0

@moooeeeep,是的,你是對的。 –

3

我會做這種方式:

params = { 
    "A": (param_1, param_2), 
    "B": (param_1, param_3), 
    "C": (param_4, param_5), 
    "D": (param_4, param_6), 
    "E": (param_4, param_7), 
} 
data = {} 

for key, args in params.items(): 
    try: 
     data[key] = getDefaultConf(*args) 
    except Exception as e: 
     log(WARNING, "Failed to get default parametres: "+str(e)) 

這裏唯一的區別是,現在的結果將通過數據字典,例如訪問data["A"]

請注意,當getDefaultConf()引發異常時,相關條目將不會包含在dict中 - 這可能是好的或壞的事情,具體取決於您計劃如何使用數據。

如果您確實需要一個默認值,當沒有賦值時,您可以使用data.get("A", None)

+2

+1完全是我的想法。名稱不變的變量始終是使用容器的指示器。 – schlamar