如何在出现异常/错误时不停止python中其他函数的执行

如何在出现异常/错误时不停止python中其他函数的执行,python,python-2.7,exception-handling,decorator,Python,Python 2.7,Exception Handling,Decorator,我有一个python脚本,如下所示。每个功能执行完全不同的任务,彼此不相关。我的问题是,如果function2()在执行过程中出现问题,那么function3(),function4(),function5()将不会执行。我知道你会说通过捕获异常(try..except)来处理这个问题,但是我必须捕获每个不是我要寻找的异常。简言之,如果任何函数出现问题,我如何编写代码,使其他函数不受影响。理想情况下,它应该排除这个有问题的函数,让另一个函数执行 def function1(): some

我有一个python脚本,如下所示。每个功能执行完全不同的任务,彼此不相关。我的问题是,如果function2()在执行过程中出现问题,那么function3()function4()function5()将不会执行。我知道你会说通过捕获异常(try..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()

无需编写多个
尝试/除了
。创建函数列表并执行它们。例如,您的代码应该如下所示:

if __name__ == '__main__':
    func_list = [function1, function2, function3, function4, function5]

    for my_func in func_list:
        try:
            my_func()
        except:
            pass
def wrap_error(func):
    def func_wrapper(*args, **kwargs):
        try:
           return func(*args, **kwargs)
        except:
           pass
    return func_wrapper

或者,创建一个decorator并将该decorator添加到每个函数中。检查。例如,您的装饰者应该是:

if __name__ == '__main__':
    func_list = [function1, function2, function3, function4, function5]

    for my_func in func_list:
        try:
            my_func()
        except:
            pass
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

将此装饰器添加到函数中不会引发任何
异常

您可以使用异常并捕获所有类似的异常

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
   }
}

因此,您可以迭代函数字典的键,并迭代Python 3.4中的参数,添加了一个新的上下文管理器As,该管理器根据文档:

返回一个上下文管理器,如果指定的异常发生在
with
语句的主体中,则该上下文管理器将抑制这些异常,然后使用with语句结尾后的第一条语句继续执行

为了抑制所有异常,您可以将其用作:

from contextlib import suppress

if __name__ == '__main__':

    func_list = [function1, function2, function3, function4, function5]

    for my_func in func_list:
        with suppress(Exception):  # `Exception` to suppress all the exceptions
            my_func()  # Any exception raised by `my_func()` will be suppressed

两个想法:你不必通过不命名具体的异常来捕捉每一个异常,对吗?我想这应该行得通。。。或者,您只需在function1()的末尾执行function2(),这样,如果之前出现错误,它就不会走得太远而提前中断。如果由于代码长度的原因导致异常处理出现问题,您可以编写一个函数,将您的所有函数“包装”在
try-中,除了
block-like
def-wrap_-em(函数列表):for func in func_list:try:func except:continue
@nostradamus-问题是我尝试了你刚才提到的方法。基本上,我的函数包含几个网络爬虫。所以我不确定我的函数什么时候会中断。因此,在这种情况下,根据哪个函数会有问题来堆积它们是行不通的。@Ev.Kounis-这可能是一个解决方案,但让我们看看其他函数会说些什么。我看到的唯一问题是参数。您不能像那样向正在运行的函数传递参数。@Ev.Kounis您可以。在这种情况下,您需要将其设置为
dict
,而不是list<代码>键
将是函数,
将是参数。数据结构取决于需求:)据我所知,这是OP明确表示他不想要的。据我所知,他计划写下可能明确出现的每个异常。但是,他可以抓住所有的例外。这种方式是不可能的,因为我的函数包含大约15个网络爬虫,用这种方式编码不是python式的。这实际上不会实现OP想要的。如果function1引发异常,function2将不会执行。@Decko很抱歉响应太晚。更新了答案以修复它。我之前错过了那部分