gpt4 book ai didi

python - Python 3.4 中的自定义异常代码和消息

转载 作者:行者123 更新时间:2023-11-30 23:21:23 25 4
gpt4 key购买 nike

我想要一个类似自定义错误代码/消息数据库的东西,并在引发异常时使用它(在 Python 3.4 中)。所以我做了以下事情:

class RecipeError(Exception):

# Custom error codes
ERRBADFLAVORMIX = 1
ERRNOINGREDIENTS = ERRBADFLAVORMIX + 1

# Custom messages
ERRMSG = {ERRBADFLAVORMIX: "Bad flavor mix",
ERRNOINGREDIENTS: "No ingredients to mix"}

raise RecipeError(RecipeError.ERRMSG[RecipeError.ERRBADFLAVORMIX])

这按预期工作,但是 raise 语句实在是太可怕了。当然,我可以以更紧凑的方式存储这些值,但我真正想知道的是:我可以做一些类似 raise RecipeError(code) 的事情吗?发送给 RecipeError 的消息?

最佳答案

当然。异常类只是普通类,因此您可以定义自己的__init__调用 super适本地:

class RecipeError(BaseException):
# existing stuff
def __init__(self, code):
super().__init__(self, RecipeError.ERRMSG[code])
<小时/>

您可能还想保存代码:

class RecipeError(BaseException):
# existing stuff
def __init__(self, code):
msg = RecipeError.ERRMSG[code]
super().__init__(self, msg)
self.code, self.msg = code, msg

查看存储在标准库异常中的信息(在 3.4 中相当不错,尽管还会有更多更改......),看看哪些类型的内容可能对存储有用。

<小时/>

一些旁注:

<小时/>

首先,使用子类而不是错误代码可能会更好。例如,如果有人想编写捕获 ERRBADFLAVORMIX 的代码但不是ERRNOINGREDIENTS ,他们必须这样做:

try:
follow_recipe()
except RecipeError as e:
if e != RecipeError.ERRBADFLAVORMIX:
raise
print('Bad flavor, bad!')

或者,如果您使用了子类:

try:
follow_recipe():
except BadFlavorRecipeError as e:
print('Bad flavor, bad!')

这就是为什么 Python 不再具有单一的 OSErrorerrno您必须打开的值,而是具有单独的子类,例如 FileNotFoundError .

<小时/>

如果您确实想使用错误代码,您可能需要考虑使用 Enum ,或者也许one of the fancier enum types on PyPI这使得为​​每个字符串附加自定义字符串变得更加容易。

<小时/>

你几乎永远不想继承 BaseException ,除非您专门试图确保您的异常不会被捕获。

关于python - Python 3.4 中的自定义异常代码和消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004491/

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