2010-12-13 10 views
1

例外を処理する最良の方法は何ですか?Pythonで例外を処理する

class SRException(Exception): 
    default_exception = True 

    def somefun1(email): 
     try: 
      user = somefun2(email) 
     except Exception, e: 
      raise SRException, ("could not find the email", e) 

    def somefun2(email): 
     try: 
      user = User.objects.get(email = email) 
     except Exception, e: 
      raise SRException, ("could not find the user objecets",e) 

例外が発生したときにだから私は例外

UserProfileException(「 ユーザまたはサービスオブジェクトを見つけることができませんでした」、 UserProfileException(「 ユーザーを見つけることができませんでした」の長いリストを取得し、 ServicesException( ' サービスを見つけることができませんでした'、 のDoesNotExist( 'クエリ に一致するサービスが存在しません。'、))))))))

エラーと上記のコード例は同じではありません。しかし、私は私の指摘を明確にしたと思います。

例外を処理する最良の方法はなんですか。 私は、すべての例外でそれを上げるべきではありません。例外が発生するたびにテクニカルチームにメールを送ります。

+0

まず、何をしたいですか?あなたのコードは意味をなさないので、私たちにあなたにアンカーを与えることを望むなら、私たちが問題を理解できるように目標を提供します。 –

答えて

2

通常、コールスタックのすべてのレベルで例外をラップする必要はありません。コールスタックのどこかで例外をキャッチし、スタックトレースをtech-support電子メールにダンプするほうがよいでしょう。これは、どこで問題が発生したのか、どこから呼び出されたのかを明確に示します。

sys.exc_info()[2]で少しずつ掘り下げて、サポートチームに違反している電子メールアドレスを与えるスタックフレームごとに、パラメータとローカルの完全なリストをダンプすることさえできます。

+0

こんにちは、ありがとう。 sys.exc_info()[2]の処理に関するリンクやブログを教えてください。 – laspal

4

例外ハンドラが広すぎる場合は、を処理できる特定の例外のの例外をキャッチします。例外をキャッチして別の例外でラップして再作成するだけの意味はありません。例外オブジェクトには、コードがどのようなパスになっているかを示すTracebackがあります。 Exceptionのバブルを上げて、例外から回復できるレベルにキャッチします。

1

まず、Exceptionをチェックしないでください。実際に期待している正しいサブタイプを常に使用してください。

また、すでに有効な例外を他の例外にカプセル化しないでください。一般的に何が起こるかの識別として例外のタイプを使用します。その後、単純に低レベルで例外(有益な情報)を投げ捨てることができ、それらを上位レベルで個別にキャッチして、エンド・ユーザーの正しいエラー・メッセージを判別することができます。

+0

Pythonでは、例外を 'raise'します。 –

+0

@Chris Morgan:ええ、私も知っていますが、それでも同じことです:Pそれ以外は、この答えはとにかく例外を持つすべての言語に当てはまります。 – poke