异常处理b的正确范围

2024-04-26 15:15:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有以下代码:

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

请注意,如果捕获异常,则不希望继续


Tags: 代码indextypeerror语句raisethrowprint
2条回答

这完全取决于你想要达到的目标——如果你想使用#1方法,如果第一个might_throw_index_error出了问题,那么下面的print和第二个might_throw_index_error将永远不会被执行。你知道吗

另一方面,最后一个可以保证至少seconprint会一直开火。你知道吗

这些方法中的每一种都是好的,但这取决于您希望对应用程序流做什么。你知道吗

创建一个decorator并将该decorator添加到每个函数定义中。有关详细信息,请查看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

现在添加这个decorator,函数定义如下:

@wrap_error
def function1():
    some code

现在您只需调用函数:

function1()  # No need to handle the errors explicitly

每次调用它时,都不必担心显式处理错误。你知道吗

相关问题 更多 >