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() |
不需要写多个
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 |
添加了这个修饰符的函数不会引发任何
从python 3.4开始,添加了一个新的上下文管理器,名为
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 } } |
因此,可以迭代函数的字典键并迭代参数