2016-02-05 3 views
6

Pythonでtry/exceptブロックを使用する場合、例外を発生させる可能性のあるメソッドや親関数で捕捉するメソッド、またはその両方に委譲することを推奨しますか?Pythonでの例外処理の配置場所

たとえば、次のうちどれですか?

def my_function(): 
    s = something.that.might.go_wrong() 
    return s 

def main(): 
    try: 
     s = my_function() 
    except Exception: 
     print "Error" 

または

def my_function(): 
    try: 
     s = something.that.might.go_wrong() 
     return s 
    except Exception: 
     print "Error" 

def main(): 
    s = my_function() 

PEP 8が問題に静かにするようだ、と私はどこにでも両方のケースの例を見つけるように見えます。

答えて

6

実際に問題の機能のセマンティクスに依存します。一般に、ライブラリを作成する場合、ライブラリはおそらくライブラリ内で発生する例外を処理する必要があります(オプションで、新しいライブラリ固有の例外としてそれらを再起することもできます)。

しかし、個々の関数レベルで考えるべき主なものは、例外を処理するために必要なコンテキスト/スコープです。内部関数内の例外的なケースでは妥当な別のことができますそれを内部関数内で扱うと便利かもしれません。さもなければ、それは外側の関数でそれを扱うほうが意味があります。

出力を書き込む特定のケースでは、最高レベルの内部関数と、(a)戻り値または(b)例外を発生させるだけの内部関数を行うことが便利なことがよくあります。これにより、副作用出力のテストを心配する必要がないため、コードのテストが容易になります。

+0

ありがとう@Amber。あなたはAlokThakurの答えとうまく関連しているテスト能力について良い点を作っています。 – mcy

0

私は常に2番目のものを使用します。私にとって論理的には、関数の問題はその関数だけで扱われるべきだと思われます。これにより、ユーザはきれいで面倒なインターフェイスが提供されるため、後でライブラリにコードを置くことができます。

あなたは関数の外の例外を使用したい場合があるかもしれません。たとえば、何か問題が発生したときに特定のメッセージを表示したい場合は、関数から例外を使用する必要があります。

しかし、ユーザが自分の例外メッセージを決定する能力を与えたい場合は、関数の引数として例外文を提供することができます。だから私は2番目の例(関数内の例外)は普遍的なだろうと思うので、優先される必要があります。あなたは「一つのタスクを処理する必要がある機能」のルールに従っている場合

2

その後、あなたはその関数で例外を処理してはならない、それは予想外の入力に大声で失敗してみましょう。そのような関数を呼び出す親関数は、ユーザーにより良い経験を与えるために処理することができます。

Pythonの組み込み関数をPythonの方法で参照できます。

+0

ありがとう@AlokThakur。あなたの答えは理にかなっており、機能をテストすることがどれほど簡単かというアンバーの答えと密接に関連しています。 – mcy

関連する問題