我有一个用python编写的脚本,它的工作方式如下所示。每个函数执行完全不同的任务,彼此不相关。我的问题是,如果函数2()在执行过程中出现问题,那么函数3()、函数4()、函数5()将不会执行。我知道你会说通过捕获异常来处理这个问题(尝试..except),但是我必须捕获不是我要查找的每个异常。简而言之,如果函数中的任何一个有问题,我如何在不影响其他函数的地方进行编码。理想情况下,它应该排除有问题的函数,让另一个函数执行。
def function1():
some code
def function2():
some code
def function3():
some code
def function4():
some code
def function5():
some code
if __name__ == '__main__':
function1()
function2()
function3()
function4()
function5()
两种想法:你不必仅仅通过不命名具体的异常来捕捉每一个异常,对吧?我想这应该管用…或者只在function1()的末尾执行function2(),所以如果前面有错误,它不会走得太远,也不会提前中断。
如果异常处理是由代码长度引起的问题,您可以编写一个函数,将您的所有函数"包装"在像def wrap_em(func_list): for func in func_list: try: func except: continue这样的try - except块中。
-问题是我尝试了你刚才提到的。基本上,我的函数包含几个网络爬虫。所以我不确定我的功能何时会中断。因此,在这种情况下,根据哪个函数会有问题来堆积它们是行不通的。
@科尼斯-这是一个解决方案,但让我们看看其他人有什么要说的。
不需要写多个try/except。创建函数列表并执行它们。例如,您的代码应该如下所示:
if __name__ == '__main__':
func_list = [function1, function2, function3, function4, function5]
for my_func in func_list:
try:
my_func()
except:
pass
或者,创建一个decorator并将该decorator添加到每个函数中。查看python函数修饰符指南。例如,您的装饰应该是:
def wrap_error(func):
def func_wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
pass
return func_wrapper
现在,将这个带有函数定义的装饰器添加为:
@wrap_error
def function1():
some code
添加了这个修饰符的函数不会引发任何Exception。
我看到的唯一问题就是论点。不能向正在运行的函数传递参数。
@Ev.Kounis你可以。在这种情况下,您需要将其设置为dict,而不是list。Key是函数,value是参数。数据结构取决于要求:)
从python 3.4开始,添加了一个新的上下文管理器,名为contextlib.suppress,根据文档:
Return a context manager that suppresses any of the specified exceptions if they occur in the body of a with statement and then resumes execution with the first statement following the end of the with statement.
为了抑制所有异常,您可以将其用作:
from contextlib import suppress
if __name__ == '__main__':
with suppress(Exception): # `Exception` to suppress all the exceptions
function1()
function2()
# Anything else you want to suppress
您可以使用异常并捕获类似于此的所有类型的异常
if __name__ == '__main__':
try:
function1()
except:
pass
try:
function2()
except:
pass
try:
function3()
except:
pass
try:
function4()
except:
pass
对于大量的函数,您可以使用
func_dict = {
func1 : {
param1 : val
param2 : val
},
func1 : {
param1 : val
param2 : val
}
}
因此,可以迭代函数的字典键并迭代参数
据我所知,这是欧普明确表示他不想拥有的。
我所理解的是,他正计划写下每一个可能明确出现的例外。但相反,他能抓住所有的例外
因为我的函数包含大约15个网络爬虫,用这种方式编码并不是Python式的,所以这种方法是不可行的。
那么字典似乎是正确的方法