Python3.4中的自定义异常代码和消息

2024-10-01 15:35:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个自定义的错误代码/消息数据库,并在引发异常时使用它。所以我做了以下几点:

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?


Tags: 数据库消息customexceptionerrorcodesclassraise
1条回答
网友
1楼 · 发布于 2024-10-01 15:35:26

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

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

您可能还想保存代码:

^{pr2}$

看看存储在标准库的异常中的信息(在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不再有一个必须打开的带有errno值的单片OSError,而是有单独的子类,比如FileNotFoundError。在


如果确实要使用错误代码,可以考虑使用^{},或者one of the fancier enum types on PyPI,这样可以更容易地为每个字符串附加自定义字符串。在


您几乎永远不想从BaseException继承,除非您特别尝试确保您的异常不会被捕获。在

相关问题 更多 >

    热门问题