10

この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,
4

2 に答える 2

28

私の記憶が正しければ、Pythonが2.5(?)で新しいraise構文に切り替えたとき、タプルmessageを優先してメンバーを削除しました。args下位互換性のために、BaseException.messageは事実上と同じものBaseException.args[0] if BaseException.args else Noneですが、新しいコードでは使用しないでください。

したがって、必要に応じて、 (すべての引数が必要な場合)または(または、引数がない可能性がある場合は、保護するより優れたバージョン)のmessageいずれかに変更します。argsargs[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
于 2012-10-25T07:46:42.950 に答える
0

あなたのSandboxErrorクラスはクラスから継承されていExceptionますか?そうでない場合は、このメッセージが表示されます。理由はPEP352に記載されています。

コードでは、例外は次のように定義する必要があります。

class SandboxException(Exception):
    ....
于 2012-10-25T07:06:28.523 に答える