繁体   English   中英

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

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

我在 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()

无需编写多个try/except 创建一个函数列表并执行它们。 例如,你的代码应该是这样的:

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

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

或者,创建一个装饰器并将该装饰添加到您的每个函数中。 检查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

从 Python 3.4 开始,添加了一个作为contextlib.suppress的新上下文管理器,根据文档:

返回一个上下文管理器,如果它们出现在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

您可以使用异常并捕获像这样的所有类型的异常

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM