小编典典

带有错误代码和错误消息的自定义Python异常

python

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)。


巴斯蒂安伦纳德提到这个SO评论,你 并不 需要总是定义一个新的__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]])

阅读 210

收藏
2020-12-20

共1个答案

小编典典

这是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]))
2020-12-20