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

How not to stop the execution of other function in python in case of Exception/Error

我有一个用python编写的脚本,它的工作方式如下所示。每个函数执行完全不同的任务,彼此不相关。我的问题是,如果函数2()在执行过程中出现问题,那么函数3()、函数4()、函数5()将不会执行。我知道你会说通过捕获异常来处理这个问题(尝试..except),但是我必须捕获不是我要查找的每个异常。简而言之,如果函数中的任何一个有问题,我如何在不影响其他函数的地方进行编码。理想情况下,它应该排除有问题的函数,让另一个函数执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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()


不需要写多个try/except。创建函数列表并执行它们。例如,您的代码应该如下所示:

1
2
3
4
5
6
7
8
if __name__ == '__main__':
    func_list = [function1, function2, function3, function4, function5]

    for my_func in func_list:
        try:
            my_func()
        except:
            pass

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

1
2
3
4
5
6
7
def wrap_error(func):
    def func_wrapper(*args, **kwargs):
        try:
           return func(*args, **kwargs)
        except:
           pass
    return func_wrapper

现在,将这个带有函数定义的装饰器添加为:

1
2
3
@wrap_error
def function1():
    some code

添加了这个修饰符的函数不会引发任何Exception


从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.

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

1
2
3
4
5
6
7
from contextlib import suppress

if __name__ == '__main__':
    with suppress(Exception):  # `Exception` to suppress all the exceptions
        function1()
        function2()
        # Anything else you want to suppress


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if __name__ == '__main__':
    try:
        function1()
    except:
        pass
    try:
        function2()
    except:
        pass    
    try:
        function3()
    except:
        pass    
    try:
        function4()
    except:
        pass

对于大量的函数,您可以使用

1
2
3
4
5
6
7
8
9
10
func_dict = {
 func1 : {
     param1 : val
     param2 : val
   },
 func1 : {
     param1 : val
     param2 : val
   }
}

因此,可以迭代函数的字典键并迭代参数