2012-06-14 86 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