2012-03-14 16 views
1

エラーメッセージと対応するエラーコードのリスト(Python Listを意味しない)を作成したいと思います。私は2つの要件を持っています - エラーコードが与えられた場合、エラーメッセージを参照できるようにするには、反対ルックアップを実行する必要があります。エラーメッセージとエラーコードのリストを定義する

  1. これを実現するネイティブのpythonデータ型はありますか?そうでない場合は、どうすれば実装できますか?
  2. このエラーメッセージ+コードのリストは、カスタム例外クラスであるBusinessRuleViolationによって使用されます。このリストをBusinessRuleViolationに関連付ける必要があり、実行時に変更しないでください。どうやってやるの?
+0

なぜエラーメッセージが表示されたらエラーコードを見つける必要がありますか?メッセージはどこから来たのですか? – jfs

+0

@ J.F.Sebastian - エラーメッセージ、コード、およびメッセージとコードの関連付けはすべて自己定義されています。エラーメッセージは、カスタム例外クラス、BusinessRuleViolationによって使用されます。私はユニットテストで 'assertRaisesRegexp'を使用するためにエラーコードを使用して対応するエラーメッセージを取得する予定です。 – tamakisquare

+0

@ J.F.Sebastian - 私の前のコメントに追加するだけです。私はエラーメッセージの文言が後で変更されることを知っているので、私はこのアプローチをとっています。私はこの瞬間に彼らの言葉遣いを心配する時間を費やすつもりはないからです。 – tamakisquare

答えて

3

通常、これはメッセージにマッピングするエラーコードとメッセージにマッピングするエラーコードの組み合わせで行います(プログラムで生成されることが多い)。

print error_codes_to_messages[2] 
print error_messages_to_codes['foo'] 
+0

答え、アンバーありがとう。それは素晴らしいようです。私の問題の2)については、 'error_codes_to_messages'をBusinessRuleViolationクラスの一部として実装し、名前を変更してはならないことを示すために名前を' ERROR_CODES_TO_MESSAGES'に変更するのは正しいですか? – tamakisquare

+0

もちろん、これは妥当と思われます。 – Amber

1

それとも、これがパフォーマンスのボトルネックになる可能性はほとんどありませんので、あなただけの、エラーコードオブジェクトのコレクションを持つことができます::

error_codes_to_messages = { 
    1: 'foo', 
    2: 'bar', 
    3: 'baz', 
} 

error_messages_to_codes = dict(
    (v,k) for k,v in error_codes_to_messages.iteritems() 
) 

その後、[]で検索を行うことができます

errors = [Error1, Error2, Error3, ...] 

def lookupError(number=None, text=None, matcher=None, multiple=False): 
    if number!=None: 
     matcher = lambda x:x.number==number 
    if text!=None: 
     matcher = lambda x:text in x.text 

    results = [e for e in errors if matcher(e)] 
    if multiple: 
     return results 
    else: 
     assert len(results)==1, 'Error lookup failed, expected one error but got {}'.format(results) 
     return results[0] 

使用法:

>>> lookupError(number=5) 
>>> lookupError(text='index') 
>>> lookupError(matcher=lambda x:x.context==StartupSequence) 
+0

に感謝ninjagecko。これは良いアプローチのようにも見えます。 – tamakisquare

2

"エラーメッセージ" - > "エラーコード"のマッピングは必要ありません。エラーコードとメッセージの両方を含む例外クラスを作成することができます。将来コードを壊さずにメッセージをローカライズすることができます。

たとえば、OSErrorは、エラーコードとメッセージを対応して含む属性がerrno,strerrorです。より便利に、あなたが頻繁に使用されるエラーコードなどのためのサブクラスを作成することができ、エラーをキャッチする

OSErrorは、PermissionErrorFileNotFoundErrorなどのサブクラスがあります。

try: 
    open(somefile) 
except FileNotFoundError: 
    # handle file not found error 
except PermissionError: 
    # handle permission problem 

Pythonは動的言語である、例外クラスを生成することは容易であるので、エラーコード、メッセージに使用している現在の表現からプログラムで作成します。

関連する問題