3

成功または失敗を返す Python のクラス関数がありますが、失敗した場合は、特定のエラー文字列を送り返したいと思っています。私は3つのアプローチを念頭に置いています:

  1. もともと None に設定されていた関数に変数 error_msg を渡します。エラーが発生した場合は、エラー文字列に設定されます。例えば:

    if !(foo(self, input, error_msg)):
        print "no error"
    else:
        print error_msg
    
  2. 関数から bool と error_msg を含むタプルを返します。

  3. エラーが発生した場合は例外を発生させ、呼び出し元のコードでキャッチします。しかし、私が取り組んでいるコードベースで例外が頻繁に使用されているのを見たことがないので、このアプローチを取ることについてあまり確信が持てませんでした.

これを行うPythonicの方法は何ですか?

4

2 に答える 2

11

独自の例外を作成し、代わりにそれを発生させます。

class MyValidationError(Exception):
    pass

def my_function():
    if not foo():
        raise MyValidationError("Error message")
    return 4

次に、関数を次のように呼び出すことができます。

try:
    result = my_function()
except MyValidationError as exception:
    # handle exception here and get error message
    print exception.message

このスタイルは EAFP (「許可よりも許しを求める方が簡単」) と呼ばれます。これは、コードを通常どおりに記述し、何か問題が発生したときに例外を発生させ、後でそれを処理することを意味します。

この一般的な Python コーディング スタイルは、有効なキーまたは属性が存在することを前提としており、その前提が偽であることが判明した場合に例外をキャッチします。このクリーンで高速なスタイルの特徴は、多くの try ステートメントと except ステートメントが存在することです。この手法は、C などの他の多くの言語に共通する LBYL スタイルとは対照的です。

于 2013-05-08T22:51:04.523 に答える
6

エラーを発生させます:

if foo(self, input, error_msg):
    raise SomethingError("You broke it")

そしてそれを処理します:

try:
    something()
except SomethingError as e:
    print str(e)

これは Pythonic アプローチであり、最も読みやすいものです。

タプル like を返す(12, None)ことは良い解決策のように思えるかもしれませんが、一貫性がないと、各メソッドが何を返すかを追跡するのは困難です。2 つの異なるデータ型を返すと、定数のデータ型を想定しているコードが壊れる可能性があるため、さらに悪化します。

于 2013-05-08T22:51:19.303 に答える