2012-10-25 9 views
9

Kann jemand mir den tatsächlichen Grund hinter der Warnung, die ich in dieser Django Middleware bekomme, sagen, und wie kann ich das lösen?DeprecationWarning: BaseException.message wurde ab Python 2.6 als Ausnahme abgelehnt .__ class__, exception.message,

Ich erhalte diese Botschaft "DeprecationWarning: BaseException.message wie von Python veraltet ist 2,6 Ausnahme Klasse, 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

Try 'isinstance (Ausnahme, SandboxError)' statt 'Ausnahme .__ class__ ist SandboxError'. – Blender

+0

Es funktioniert nicht für mich Mixer ... danke für Ihre schnelle Antwort. Eigentlich bekomme ich die Warnung auf Ausnahme .__ class__, exception.message diese Zeile. – PythonDev

Antwort

24

Wenn ich mich richtig erinnere, wenn Python auf die neue Erhöhung Syntax in 2,5 geschaltet, wurden sie von dem zugunsten message Mitglied los:

In Code, sollten Sie Ihre Ausnahme wie folgt definiert werden (?) von einem args Tupel. Aus Gründen der Abwärtskompatibilität ist BaseException.message effektiv dasselbe wie BaseException.args[0] if BaseException.args else None, aber Sie sollten es nicht in neuem Code verwenden.

So ändern message entweder args (wenn Sie alle args wollen) oder args[0] (oder, wenn Sie besorgt sind, gibt es keine Argumente sein, die schickere Version, die gegen () schützt), je nachdem, welche Sie wollen.

Der Grund für diese Änderung ist, dass es mit den Ausnahmen des neuen Stils keine Magie mehr für raise oder except gibt; Sie rufen nur den Konstruktor der Ausnahmeklasse in der raise-Anweisung auf und fangen die Ausnahme in einer Variablen in der except-Anweisung ein. Also:

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

Dies wird ('Out of cheese error', 42) drucken. Wenn Sie nur print x.message hätten, würden Sie nur 'Out of cheese error' bekommen. So können die Exception-Subclasses, die früher dazu dienten, ausgefallene Dinge zu tun, um einen Fehlercode als separates Member usw. zu übertragen, vereinfacht werden; in der Tat kommt das Ganze bis auf diese:

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

Ist Ihre SandboxError Klasse von den Exception geerbt Klasse? Wenn nicht, erhalten Sie diese Nachricht. Die Begründung wird in PEP352 beschrieben.

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

Ja, ich habe die SandboxError-Klasse von Exception geerbt. Klasse SandboxError (Ausnahme): übergeben – PythonDev