gpt4 book ai didi

python - Python 中的简洁异常处理

转载 作者:太空狗 更新时间:2023-10-30 02:04:04 26 4
gpt4 key购买 nike

我喜欢避免“三思而后行”的范式,因为我重视易于阅读的代码。在某些情况下,我无法预测是否会发生错误,例如资源可用性或内存不足错误。我还没有找到一种干净的方法来编写重复或冗长的代码来处理这些情况。

以下示例的可读性差强人意,但重复代码是 Not Acceptable 。

try:
myobject.write(filename)
except OSError:
if prompt("%s is in use by another application." +
"Close that application and try again.") == "Try again":
myobject.write(filename) #repeated code

为了删除重复的代码,我必须再添加几行并缩进所有内容,从而降低可读性。

success = False
while not success:
try:
myobject.write(filename)
success = True
except OSError:
if prompt("%s is in use by another application." +
"Close that application and try again.") != "Try again":
break

有没有更短的 Python 编写方法,不会重复代码?

最佳答案

除了切换到 while True 之外,您还可以添加一个 retry 装饰器,并将可重试的代码移动到由 retry 装饰的函数>:

from functools import wraps
from functools import update_wrapper


def retry(prompt_text="An error occured! Retry (y/n)?",
prompt_match='y',
exception=Exception):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
while True:
try:
ret = func(*args, **kwargs)
break
except exception:
if raw_input(prompt_text) == prompt_match:
ret = None
break
return ret
return update_wrapper(wrapper, func)
return decorator

@retry(prompt_text="your prompt: ", prompt_match="quit", exception=OSError)
def do_write(myobject, filename):
myobject.write(filename)

if __name__ == "__main__":
myobject = ...
filename = ...
do_write(myobject, filename) # This will be retried.

不过,只有在多个地方使用此模式时,这可能才值得付出努力。

关于python - Python 中的简洁异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24728295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com