2012-10-25 6 views
9

私はこのDjangoミドルウェアに入っている警告の背後にある実際の理由を誰にも教えてください。DeprecationWarning:BaseException.messageはPython 2.6の例外として廃止されました。class__、exception.message、

私はこのメッセージを取得しています:

class GeneralMiddleware(object): 
    def process_exception(self, request, exception): 
     if exception.__class__ is SandboxError: 
      # someone is trying to access a sandbox that he has no 
      # permission to 
      return HttpResponseRedirect("/notpermitted/") 

     exc_type, value, tb = sys.exc_info() 
     data = traceback.format_tb(
        tb, None) + traceback.format_exception_only(
        exc_type, value) 
     msg = (
      "Failure when calling method:\n" 
      u"URL:'%s'\nMethod:'%s'\nException Type:'%s'\n" 
      u"Error Message '%s'\nFull Message:\n%s" 
      % (request.get_full_path(), request.method, 
       exception.__class__, exception.message, 
+0

'exception .__ classbox__ is SandboxError'の代わりに' isinstance(exception、SandboxError) 'を試してください。 – Blender

+0

それは私のブレンダーのために働かない...あなたの速い応答のためにありがとう。実際に私は例外の警告を得ています。__ class__、exception.messageこの行。 – PythonDev

答えて

24

、彼らは賛成でmessageメンバーを処分しましたタプルはargsです。下位互換性のため、BaseException.messageは実質的にBaseException.args[0] if BaseException.args else Noneと同じものですが、新しいコードで使用しないでください。 (あなたは何の引数、()から保護手の込んだバージョンが存在しない場合が心配している場合、または)

だから、あなたがしたいかに応じて、どちらかargsからmessage(あなたがしたい場合は、すべての引数)またはargs[0]を変更します。

この変更の理由は、新しいスタイルの例外では、raiseまたはexceptへの魔法はもうありません。 raiseステートメントで例外クラスのコンストラクターを呼び出し、exceptステートメントの変数で例外をキャッチするだけです。したがって:

try: 
    raise MyException('Out of cheese error', 42) 
except Exception as x: 
    print x.args 

これは('Out of cheese error', 42)と表示されます。 print x.messageしか持っていなかった場合は、'Out of cheese error'になります。したがって、別のメンバーなどとしてエラーコードを持ち歩くために派手なことをしなければならなかったExceptionサブクラスは、単純化することができます。実際にはすべてがこれになります:

class BaseException(object): 
    def __init__(self, *args): 
    self.args = args 
0

Exceptionから継承されたあなたのSandboxErrorクラスである "DeprecationWarning。BaseException.messageがは、Python 2.6例外クラス、exception.message、で廃止されました"クラス?そうでない場合は、このメッセージが表示されます。推論はPEP352に記載されています。コードで

、あなたの例外は次のように定義する必要があります(?)私の記憶が正しければ、Pythonは2.5で新しい昇給構文に切り替わったときに、

class SandboxException(Exception): 
    .... 
+0

はい、私は例外からSandboxErrorクラスを継承しています。 SandboxErrorクラス(例外): が合格 – PythonDev

関連する問題