在Python中简化try-except块

时间:2015-12-04 10:31:45

标签: python exception try-catch try-except

我有很多模块。它们在每个文件中都有类似的try-except块,如下所示:

from shared.Exceptions import ArgException # and others, as needed

try:

    do_the_main_app_here()

except ArgException as e:

    Response.result = {
        'status': 'error',
        'message': str(e)
    }
    Response.exitcode('USAGE')

# more blocks like the above

将ArgException(和其他异常)定义为:

from abc import ABCMeta, abstractmethod
class ETrait(Exception):
    __metaclass__ = ABCMeta
    @abstractmethod
    def __init__(self, msg):
        self.msg = msg
    def __str__(self):
        return self.msg

class ArgException(ETrait): pass

由于每个模块都使用类似的代码来捕获异常,有没有办法将异常捕获到所有模块使用的共享文件中?

2 个答案:

答案 0 :(得分:0)

我不会这样做,但您可以在以下模块中创建一个函数:

from shared.Exceptions import ArgException # and others, as needed
def try_exec(execution_function)
    try:
        execution_function()
    except ArgException as e:
        Response.result = {
            'status': 'error',
            'message': str(e)
        }
        Response.exitcode('USAGE')

然后在需要尝试捕获指令块时调用try_exec(do_the_main_app_here),传递所需的参数以获得正确的上下文。

答案 1 :(得分:0)

答案是肯定的,你可以创建一个模块来做到这一点。

最简单的方法是创建一个接受两个参数的函数:另一个函数,其中包含您想要的代码"尝试"和"行动"在例外的情况下被采取。

然后:

def myModuleFunction(tryThisCode, doThis):
    try:
        returnValue = tryThisCode()
        return returnValue
    except ArgException as e:
        if (doThis == "doThat"):
           ...
        else:
           ...

然后,在导入新模块后,您可以使用以下功能:

myModuleFunction(divideByZero, 'printMe')

假设您有一个名为divideByZero();

的函数

我希望这会有所帮助。