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。”
错误1100:“找不到关键参数。请验证您的输入。”
错误1101:“找不到日期参数。请验证您的输入”
错误2100:“多天参数无效。可接受的值为2、5和7。”
并向用户报告。
(PS:这适用于Python 2.4.3)。
巴斯蒂安伦纳德提到这个SO评论,你 并不 需要总是定义一个新的__init__或__str__; 默认情况下,参数将放置在self.args中,并由打印__str__。
__init__
__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]])
这是Exception带有特殊代码的自定义类的快速示例:
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这里有一个附加示例…
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]))