如果异常/错误

时间:2016-10-18 08:04:13

标签: python python-2.7 exception-handling decorator

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

3 个答案:

答案 0 :(得分:6)

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

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

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

或者,创建一个装饰器并将该装饰器添加到您的每个功能中。检查A guide to Python's function decorators。例如,你的装饰者应该是:

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

  

返回一个上下文管理器,如果它们出现在with语句的主体中,则会抑制任何指定的异常,然后在with语句结束后的第一个语句中继续执行。

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

from contextlib import suppress

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