【问题标题】:Custom Python Exceptions with Error Codes and Error Messages带有错误代码和错误消息的自定义 Python 异常
【发布时间】:2011-09-05 00:42:31
【问题描述】:
class AppError(Exception):
    pass

class MissingInputError(AppError):
    pass

class ValidationError(AppError):
    pass

...

def validate(self):
    """ Validate Input and save it """

    params = self.__params

    if 'key' in params:
        self.__validateKey(escape(params['key'][0]))
    else:
        raise MissingInputError

    if 'svc' in params:
        self.__validateService(escape(params['svc'][0]))
    else:
        raise MissingInputError

    if 'dt' in params:
        self.__validateDate(escape(params['dt'][0]))
    else:
        raise MissingInputError


def __validateMulti(self, m):
    """ Validate Multiple Days Request"""

    if m not in Input.__validDays:
        raise ValidationError

    self.__dCast = int(m)

validate() 和 __validateMulti() 是验证和存储传递的输入参数的类的方法。从代码中可以看出,当某些输入参数丢失或某些验证失败时,我会引发一些自定义异常。

我想定义一些特定于我的应用的自定义错误代码和错误消息,例如,

错误 1100:“未找到关键参数。请验证您的输入。”

错误 1101:“未找到日期参数。请验证您的输入”

...

错误 2100:“多天参数无效。可接受的值为 2、5 和 7。”

并向用户报告。

  1. 如何在自定义异常中定义这些错误代码和错误消息?
  2. 如何以我知道要显示什么错误代码/消息的方式引发/捕获异常?

(PS:这是针对 Python 2.4.3)。


Bastien Léonard 在此SO comment 中提到您不需要总是需要定义一个新的__init____str__;默认情况下,参数将放在 self.args 中,并由__str__ 打印。

因此,我更喜欢的解决方案:

class AppError(Exception): pass

class MissingInputError(AppError):
    
    # define the error codes & messages here
    em = {1101: "Some error here. Please verify.", \
          1102: "Another here. Please verify.", \
          1103: "One more here. Please verify.", \
          1104: "That was idiotic. Please verify."}

用法:

try:
    # do something here that calls
    # raise MissingInputError(1101)

except MissingInputError, e
    print "%d: %s" % (e.args[0], e.em[e.args[0]])

【问题讨论】:

  • 当try语句中的代码失败时你不应该引发错误吗?

标签: python error-handling custom-exceptions


【解决方案1】:

这是我创建的使用预定义错误代码的自定义异常示例:

class CustomError(Exception):
"""
Custom Exception
"""

  def __init__(self, error_code, message='', *args, **kwargs):

      # Raise a separate exception in case the error code passed isn't specified in the ErrorCodes enum
      if not isinstance(error_code, ErrorCodes):
          msg = 'Error code passed in the error_code param must be of type {0}'
          raise CustomError(ErrorCodes.ERR_INCORRECT_ERRCODE, msg, ErrorCodes.__class__.__name__)

      # Storing the error code on the exception object
      self.error_code = error_code

      # storing the traceback which provides useful information about where the exception occurred
      self.traceback = sys.exc_info()

      # Prefixing the error code to the exception message
      try:
          msg = '[{0}] {1}'.format(error_code.name, message.format(*args, **kwargs))
      except (IndexError, KeyError):
          msg = '[{0}] {1}'.format(error_code.name, message)

      super().__init__(msg)


# Error codes for all module exceptions
@unique
class ErrorCodes(Enum):
    ERR_INCORRECT_ERRCODE = auto()      # error code passed is not specified in enum ErrorCodes
    ERR_SITUATION_1 = auto()            # description of situation 1
    ERR_SITUATION_2 = auto()            # description of situation 2
    ERR_SITUATION_3 = auto()            # description of situation 3
    ERR_SITUATION_4 = auto()            # description of situation 4
    ERR_SITUATION_5 = auto()            # description of situation 5
    ERR_SITUATION_6 = auto()            # description of situation 6

枚举 ErrorCodes 用于定义错误代码。 异常的创建方式是传递的错误代码作为异常消息的前缀。

【讨论】:

    【解决方案2】:

    这是一个带有特殊代码的自定义 Exception 类的快速示例:

    class ErrorWithCode(Exception):
        def __init__(self, code):
            self.code = code
        def __str__(self):
            return repr(self.code)
    
    try:
        raise ErrorWithCode(1000)
    except ErrorWithCode as e:
        print("Received error with code:", e.code)
    

    既然您问的是如何使用args,这里还有一个示例...

    class ErrorWithArgs(Exception):
        def __init__(self, *args):
            # *args is used to get a list of the parameters passed in
            self.args = [a for a in args]
    
    try:
        raise ErrorWithArgs(1, "text", "some more text")
    except ErrorWithArgs as e:
        print("%d: %s - %s" % (e.args[0], e.args[1], e.args[2]))
    

    【讨论】:

    • 有没有办法在自定义异常中存储这些错误代码和错误消息?例如,这是如何工作的 - 除了 MySQLdb.Error, e: print "%d: %s" % (e.args[0], e.args[1]) ?
    • 不完全确定我知道你在问什么。我添加了一个可能实现您在我的回答中显示的内容的示例。
    • 谢谢,布莱恩。 @Keith:是的,我也有类似的想法——我们可以在自定义异常类中定义错误代码和错误消息的字典,并访问/输出...
    • 如果您将*args 替换为**kwargs,您可以通过关键字定义参数值。示例:message="File not found", errorcode="10"
    • 出于兴趣...为什么不self.args = args
    猜你喜欢
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2014-02-04
    • 2012-05-08
    • 2017-12-17
    • 2016-12-17
    相关资源
    最近更新 更多