1

私の職場では、例外を使用しないというルールが課されています (キャッチは許可されています)。このようなコードがある場合

def f1()
 if bad_thing_happen():
   raise Exception('bad stuff')
 ...
 return something

私はそれをに変更することができました

def f1()
  if bad_thing_happen():
    return [-1, None]
  ...
  return [0, something]

f1の呼び出し元は次のようになります

def f1_caller():
  code, result = f1(param1)
  if code < 0:
    return code
  actual_work1()
  # call f1 again
  code, result = f1(param2)
  if code < 0:
    return code
  actual_work2()
  ...

Python でこれよりもエレガントな方法はありますか?

4

3 に答える 3

3

Pythonの例外は避けるべきものではなく、問題を解決するための簡単な方法であることがよくあります。さらに、例外には大量の情報が含まれており、(スタックトレースを介して)問題をすばやく特定し、(例外クラスまたはメッセージを介して)問題を特定するのに役立ちます。

この包括的なポリシーを思いついた人は誰でも、例外をスローする方がよりコストのかかる操作である別の言語(おそらくC ++?)を考えていたはずです(コードが20年前のコンピューターで実行されている場合はパフォーマンスが低下します)。

あなたの質問に答えるには:別の方法はエラーコードを返すことです。これは、関数の結果とエラー処理を混合していることを意味します。これにより、(ha!)それ自体の問題が発生します。ただし、多くの場合、戻るNoneことは関数の失敗を示すための完全に合理的な方法です。

于 2010-10-06T03:42:42.550 に答える
1

返品Noneはかなり一般的であり、概念的にはうまく機能します。戻り値を期待していて、何も得られない場合、それは何かがうまくいかなかったことを示す良い兆候です。

リスト(または辞書など)を返すことを期待している場合の別の可能なアプローチは、空のリストまたはdictを返すことです。if空のコンテナはPythonで評価されるため、これを使用して簡単にテストできます。また、コンテナFalseを反復処理する場合は、チェックする必要がない場合もあります(関数が失敗した場合に何をしたいかによって異なります)。

もちろん、これらのアプローチでは、関数が失敗した理由はわかりません。したがって、などの例外インスタンスを返すことができますreturn ValueError("invalid index")。次に、それらを使用して特定の例外(または一般的な例外)をテストし、isinstance()それらを印刷して、適切なエラーメッセージを取得できます。(または、戻りコードをテストして、それが派生したものかどうかを確認するヘルパー関数を提供するExceptionこともできます。)独自のExceptionサブクラスを作成することもできます。あなたはそれらを上げるのではなく、単にそれらを返すでしょう。

最後に、例外はPythonの動作の重要な部分であり、オーバーヘッドが低く、関数を使用するすべての人に期待されるため、このばかげたポリシーの変更に向けて取り組みます。

于 2010-10-06T03:50:34.210 に答える
1

リターン コードを使用する必要があります。他の選択肢としては、変更可能なグローバル状態 (C の errno を考えてください) や変更可能なオブジェクト (リストなど) を渡す方法がありますが、ほとんどの場合、Python では両方を避けたいと考えています。おそらく、例外を使用すると、戻り値に複雑さを追加する代わりに、より適切な事後条件を記述できるが、それ以外は同等であることを彼らに説明してみてください。

于 2010-10-06T03:54:05.463 に答える