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建议的更具体的异常,使用classclass MoreSpecificError(异常)创建一个更具体的异常
并使用self.message
定义要打印的消息error@FlavioMoraesException.message已弃用。谢谢@Tom;我以前从未创建过自定义异常,因此这非常有用。