2012-10-25 8 views
9

Qualcuno può dirmi il motivo reale dietro l'avviso che sto ricevendo in questo middleware Django e come posso risolverlo?DeprecationWarning: BaseException.message è stato dichiarato obsoleto a partire dall'eccezione Python 2.6 .__ class__, exception.message,

sto ottenendo questo messaggio "DeprecationWarning: BaseException.message è stata deprecata come di Python 2.6 eccezione classe, 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

Provare 'isinstance (eccezione, SandboxError)' invece di 'exception .__ class__ è SandboxError'. – Blender

+0

Non funziona per me frullatore ... grazie per la vostra risposta veloce. In realtà sto ricevendo l'avviso su exception .__ class__, exception.message this line. – PythonDev

risposta

24

Se non ricordo male, quando Python commutato la nuova sintassi rilancio in 2.5, si sono liberati del membro message a favore (?) di una tupla args. Per compatibilità con le versioni precedenti, BaseException.message è effettivamente la stessa cosa di BaseException.args[0] if BaseException.args else None, ma non dovresti usarlo nel nuovo codice.

Quindi, modificare message a uno args (se si desidera che tutti i args) o args[0] (o, se siete preoccupati non ci possono essere args, la versione più elaborata che protegge contro ()), a seconda di quale si desidera.

La ragione di questo cambiamento è che con le eccezioni del nuovo stile, non c'è più magia per raise o except; stai chiamando il costruttore della classe di eccezioni nell'istruzione raise e rilevi l'eccezione in una variabile nell'istruzione except. Quindi:

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

Questo stamperà ('Out of cheese error', 42). Se tu avessi solo print x.message ti piacerebbe solo ottenere 'Out of cheese error'. Quindi, le sottoclassi Exception che un tempo dovevano fare cose fantasiose per portare in giro un codice di errore come membro separato, ecc., Possono essere semplificate; infatti, il tutto si riduce a questo:

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

È il vostro SandboxError classe ereditata dalla Exception classe? In caso contrario, riceverai questo messaggio. Il ragionamento è descritto in PEP352.

Nel codice, il tuo eccezione dovrebbe essere definito in questo modo:

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

Sì, ho ereditato la classe SandboxError da Exception. class SandboxError (Exception): pass – PythonDev