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

Python 最佳实践:在KeyError上,打印或引发自定义消息的KeyError?,python,python-3.x,Python,Python 3.x,假设我有一个dict,比如: envs = { "prod": "PRODSERVERNAME", "test": "TESTSERVERNAME", "dev": "DEVSERVERNAME" } 我想更改KeyError返回的消息,我在关于该主题的web文章中看到的是打印出新消息,如: try: server = envs[env] ex

假设我有一个
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())}'
        )
但是,除了一个错误,仅仅抛出相同类型的错误,在最好的情况下似乎是不雅的,在最坏的情况下似乎是不雅的

我的问题是:处理这种情况的适当方式是什么?是否有任何文档我可能错过了与此主题相关的最佳实践


提前谢谢。

我想这是一个偏好的问题。您的代码可以正常工作,并且可以按原样读取。这只是一个你想完成什么的问题

在这种特定情况下,您并不真正希望处理
keyrerror
,而是在缺少一个环境变量时引发一个自定义异常。那就去做吧

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']))

提出更具体的自定义异常可能更为惯用。例如
raise missingenevar(env)
您检查过了吗?我的经验法则是,如果您不能实际处理错误并进行恢复,那么就根本无法捕获它。您可以创建Ross建议的更具体的异常,使用class
class MoreSpecificError(异常)创建一个更具体的异常
并使用
self.message
定义要打印的消息error@FlavioMoraesException.message已弃用。谢谢@Tom;我以前从未创建过自定义异常,因此这非常有用。