假设我们有以下代码:
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
请注意,如果我们捕获异常,我们不想继续
答案 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
每次调用错误时都不必担心明确处理错误。