49
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 コメントで、常に新しいorを定義する必要はないと述べています。デフォルトでは、引数は self.args に配置され、 によって出力されます。__init____str____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]])
4

2 に答える 2

82

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]))
于 2011-05-30T19:47:59.560 に答える