正确范围的异常处理块

时间:2016-10-25 10:19:51

标签: python exception error-handling code-readability

假设我们有以下代码:

print("...")
might_throw_type_error()
print("...")
might_throw_index_error()

如果我们想要处理这些函数可能出现的异常,那么首选方法是什么:

完全拆分“业务”代码和错误处理

try:
    print("...")
    might_throw_type_error()
    print("...")
    might_throw_index_error()
except IndexError:
    # index error handling logic
    raise
except TypeError:
    # index error handling logic
    raise

分离逻辑和错误处理,但尝试从可能引发的第一个语句开始

print("...")
try:
    might_throw_type_error()
    print("...")
    might_throw_index_error()
except IndexError:
    # index error handling logic
    raise
except TypeError:
    # index error handling logic
    raise

异常处理应该只包装我们希望引发的语句

print("...")
try:
    might_throw_type_error()
except TypeError:
    # index error handling logic
    raise
print("...")
try:
    might_throw_index_error()
except IndexError:
    # index error handling logic
    raise

请注意,如果我们捕获异常,我们不想继续

2 个答案:

答案 0 :(得分:2)

它肯定取决于你想要实现的目标 - 考虑一下,如果第一个{{1}出现问题,你会使用#1 方法以下might_throw_index_error和第二print 永远不会被执行

另一方面,最后一个保证至少secon might_throw_index_error将始终开火。

这些方法都很好,但这取决于您对应用程序流程的要求。

答案 1 :(得分:-1)

创建装饰器并将该装饰器添加到每个功能定义中。查看A guide to Python's function decorators以获取详细信息。例如,你的装饰者应该是:

def wrap_error(func):
    def func_wrapper(*args, **kwargs):
        try:
           return func(*args, **kwargs)
        except ValueError:
           # Some logic here
        except IndexError:
           # some logic here
    return func_wrapper

现在使用您的函数定义添加此装饰器:

@wrap_error
def function1():
    some code

现在你可以简单地调用函数:

function1()  # No need to handle the errors explicitly

每次调用错误时都不必担心明确处理错误。