2012-10-25 8 views
9

Czy ktoś może mi podać faktyczną przyczynę ostrzeżenia, które dostaję w tym oprogramowaniu pośredniczącym Django i jak mogę to rozwiązać?DeprecationWarning: BaseException.message został wycofany z powodu wyjątku Python 2.6 .__ class__, exception.message,

Dostaję komunikat "DeprecationWarning: BaseException.message został wycofany z Pythona 2.6 wyjątek klasy, 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

Spróbuj 'isinstance (wyjątek, SandboxError)' zamiast 'wyjątku .__ class__ to SandboxError'. – Blender

+0

To nie działa dla mnie mikser ... dzięki za szybką reakcję. Właściwie otrzymuję ostrzeżenie o wyjątku .__ class__, exception.message this line. – PythonDev

Odpowiedz

24

Jeśli dobrze pamiętam, gdy Python włączony do nowej składni podbicie 2,5, pozbyli członu message na korzyść (?) z krotki args. Ze względu na kompatybilność wsteczną, BaseException.message jest faktycznie tym samym co BaseException.args[0] if BaseException.args else None, ale nie powinieneś używać go w nowym kodzie.

więc zmienić message do obu args (jeśli chcesz wszystkie args) lub args[0] (lub, jeśli martwisz mogą istnieć żadne argumenty, hodowcy wersja, która chroni przed ()), w zależności od których chcesz.

Powodem tej zmiany jest to, że z wyjątkami w nowym stylu nie ma już magii dla raise lub except; po prostu wywołujesz konstruktor klasy wyjątków w instrukcji raise i przechwytywanie wyjątku w zmiennej w instrukcji except. A więc:

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

To spowoduje wydruk ('Out of cheese error', 42). Jeśli masz tylko print x.message, dostaniesz 'Out of cheese error'. Tak więc podklasy wyjątków, które kiedyś musiały robić fantazyjne rzeczy, aby nosić kod błędu jako oddzielny element itp., Mogą być uproszczone; w rzeczywistości wszystko sprowadza się do:

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

Czy Twoja klasa SandboxError dziedziczone z Exception klasa? Jeśli nie, otrzymasz tę wiadomość. Rozumowanie jest opisane w PEP352.

W kodzie, Twój Wyjątkiem powinny być zdefiniowane tak:

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

Tak, odziedziczyłem klasę SandboxError z wyjątku. klasa SandboxError (wyjątek): podanie – PythonDev

Powiązane problemy