2

こんにちは、最近 Python でコーディングを始めましたが、エラーを処理する方法を知りたいと思っています。私はチュートリアルのdivintopythonを実行しましたが、そこで彼はraise errorを使用して、何がうまくいかないかをフィードバックします。ここで私のケース: 数値を表す文字列が 7 桁または 8 桁の長さであるかどうかをチェックする関数があります。

def checkNumber( someNumber ):
  ''' checks if Number is valid '''
  someNumber = str(someNumber);
  if not 6 < len(someNumber) < 9:
     raise ValueError('number must be either 7 or 8')
  if not re.search('^[0-9]{7,8}$', someNumber):
     raise ValueError('only digits from 0...9')
  sum = 0
  if len(pzn) == 7: someNumber = '0' + someNumber
  for n, a in list(enumerate(someNumber[:-1], start=1)):
     sum += int(a)*n
  if someNumber[-1]==str(sum%11):
     return someNumber
  else:   
     raise ValueError('not a vaild code')

この関数をスタンドアロンで使用していますが、バーコードをスキャンし、この関数を呼び出してコードを検証する他の関数からも呼び出します。したがって、スキャン番号が正しい場合は続行し、そうでない場合はスキャンを続行する必要があります。私のようにそれを行い、try/except ブロックをスキャナー関数に入れる方が良いですか、それとも False を返す必要がありますか?

どうもありがとう

4

2 に答える 2

8

例外を発生させる方が良いです。それが例外の目的です。

また、返すFalseには、 と の違いをテストするコードを処理する必要があり0ますFalse。突然、関数の戻り値をテストする必要があります。

あなたの機能は、分裂した性格に苦しんでいるようです。一方で、名前を付けましたcheckNumberが、ドキュメントでは、番号が有効かどうかを確認していると主張しています。一方、それは を変換し、その数値を変更し、それを文字列に変換し、さらにグローバルの長さが 7 の0場合は先頭に a を追加します。pzn

関数が数値が有効かどうかをテストするだけの場合、ブール値を返すことは理にかなっています。例外を使用すると、おそらく検証の失敗の性質に関する詳細情報を得ることができますが、その情報が必要ない場合はブール値で十分です。

ただし、数値を別の型と形式に変換する必要がある場合は、関数の名前を変更し、検証エラーを通常の動作の例外にする必要があります。その場合、関数は変換された値を返すことが期待され、無効な入力は例外を発生させて、入力のエラーのために通常の値を返すことができなかったことを示します。

于 2012-12-06T09:59:16.403 に答える
3

純粋主義者は、Python では「許可よりも許しを求めるほうが簡単だ」と言うでしょう。これは、可能な限り常に例外を使用する必要があることを意味します。

また、理にかなっている場合は、例外を使用することも好みます。直感的にTrueまたはを返す必要があるメソッドFalse(たとえば、のようなものis_valid_number())の場合、ブール値を返すだけで例外を発生させない方が明白で読みやすいと思います。

のようなメソッドのconvert_number()場合、例外を使用する必要があります。そうしないと、戻りコードの処理によってコードが混乱する可能性があります。

あなたのコードから、最後にすべきではないことがわかりreturn someNumberました。Trueまたはを返すだけですFalse

チェックが失敗した理由に関心がある場合は、呼び出し元に "エラー メッセージ" をきれいに返すことができるため、例外を使用することをお勧めします。この場合、何も返す必要はありません。それを呼び出して例外が発生しないという事実は、番号が有効であることをすでに意味しています。

最後に、数値を別のものに変換することを意図している場合は、メソッドを呼び出しconvert_number()、問題がなければ数値を返し、エラーの場合は例外を発生させる必要があります。

于 2012-12-06T10:19:09.117 に答える