繁体   English   中英

最佳实践:在 KeyError 上,打印或引发自定义消息的 KeyError?

[英]Best practice: On KeyError, print or raise KeyError for a custom message?

假设我有一个像这样的dict

envs = {
    "prod": "PRODSERVERNAME",
    "test": "TESTSERVERNAME",
    "dev": "DEVSERVERNAME"
}

我想更改KeyError返回的消息,我在 web 文章中看到的有关该主题的内容是打印出新消息,例如:

try:
    server = envs[env]
except KeyError:
    print(
        f'No environment found for "{env}"; env must be one of the following: {", ".join(envs.keys())}'
        )

在我看来,我仍然想抛出适当的错误(在这种情况下,将抛出KeyError ),只是提供有关该错误的更多有用/具体信息。 有了这个假设(如果有最佳实践,请纠正我),我会像这样实现这个意图:

try:
    server = envs[env]
except KeyError:
    raise KeyError(
        f'No environment found for "{env}"; env must be one of the following: {", ".join(envs.keys())}'
        )

但是排除错误只是抛出相同类型的错误充其量似乎是不优雅的,最坏的情况下是简陋的。

我的问题是:处理这种情况的适当方法是什么? 关于与此主题相关的最佳实践,是否有任何我可能遗漏的文档?

提前致谢。

我会说这是一个偏好问题。 您的代码将工作得很好,并且可以按原样阅读。 这只是您尝试完成的事情的问题。

在这种特定情况下,您真的不想处理KeyError ,而是在缺少一个环境变量时引发自定义异常。 所以就去做吧。

class CustomException(KeyError):
    def __init__(self, missing, allowed):
        self.value = f"No environment found for {missing}; env must be one of the following: {allowed}"

    def __str__(self):
        return repr(self.value)


server = envs.get(env)
if not server:
    raise CustomException('a', ', '.join(['a', 'b', 'c']))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM