Meld u alle fouten te troosten of bestand op Django website

stemmen
13

Hoe kan ik Django 1.0 te schrijven alle fouten op de console of een logbestand bij het uitvoeren van runserver in debug-modus?

Ik heb geprobeerd met behulp van een middleware klas met process_exception werken zoals beschreven in de geaccepteerde antwoord op deze vraag:

Hoe ga je server fouten op Django websites aanmelden

De process_exception functie wordt aangeroepen voor bepaalde uitzonderingen (bv: assert (Valse) in views.py), maar process_exception krijgt niet opgeroepen voor andere fouten zoals ImportErrors (bijvoorbeeld: import thisclassdoesnotexist in urs.py). Ik ben nieuw in Django / Python. Is dit vanwege een onderscheid tussen run-time en compile-time fouten? Maar dan zou ik verwachten runserver te klagen als het was een compilatie fout en het niet.

Ik heb fantastische presentatie Simon Willison op Django debugging (keken http://simonwillison.net/2008/May/22/debugging/ ), maar ik heb niet zien een optie die goed zou werken voor mij.

In het geval dat het relevant is, ben ik het schrijven van een Facebook app en Facebook maskers HTTP 500 fouten met hun eigen bericht eerder dan het tonen van Django's vreselijk informatieve 500 pagina's. Dus ik moet een manier voor alle soorten fouten worden geschreven naar de console of het bestand.

Edit: Ik denk dat mijn verwachting is dat als Django een 500 error pagina kan terugkeren met veel detail als ik een slechte import (ImportError) in urls.py, moet hij in staat om hetzelfde detail aan de console of een bestand te schrijven zonder hoeven geen extra exception handling toe te voegen aan de code. Ik heb nog nooit exception handling rond import statements gezien.

Bedankt, Jeff

De vraag is gesteld op 27/03/2009 om 18:30
bron van user
In andere talen...                            


5 antwoorden

stemmen
2

Ten eerste zijn er zeer weinig compile-time fouten die je zult zien via een uitzondering log. Als uw Python-code geldige syntax heeft, sterft het lang voordat logs worden geopend voor het schrijven.

In Django runserver modus, een "print" statement schrijft naar stdout, die u kunt zien. Dit is geen goede oplossing op lange termijn, echter, dus niet op rekenen.

Wanneer Django wordt uitgevoerd onder Apache, maar het hangt af van welke plug-in die u gebruikt. mod_python is niet gemakkelijk te behandelen. mod_wsgi kunnen worden gedwongen tot het verzenden van stdout en stderr naar een logbestand.

U kunt het beste, echter, is de logging module. Zet een initialisatie in uw top-level urls.pyte logging configureren. (Of, misschien, je settings.py)

Wees er zeker van dat elke module heeft een logger beschikbaar voor het schrijven van log berichten.

Wees er zeker van dat elke web services bellen die je maakt heeft een try / behalve blok rond het, en je de uitzonderingen schrijven naar je log.

antwoordde op 27/03/2009 om 19:51
bron van user

stemmen
13

Het is een beetje extreem, maar voor het debuggen doeleinden, kunt u de DEBUG_PROPAGATE_EXCEPTIONSinstelling. Dit zal u toelaten om uw eigen foutafhandeling. De eenvoudigste manier om het opzetten van genoemde behandelingen fout zou zijn om te negeren sys.excepthook . Dit zal uw toepassing te beëindigen, maar het zal werken. Er kunnen dingen die je kunt doen om dit uw app niet doden, maar dit is afhankelijk van welk platform je dit het inzetten voor. In ieder geval, gebruik deze nooit in productie!

Voor de productie, je vrij veel gaat te hebben om een ​​uitgebreide foutafhandeling in de plaats. Een techniek die ik heb gebruikt is ongeveer als volgt:

>>> def log_error(func):
...     def _call_func(*args, **argd):
...         try:
...             func(*args, **argd)
...         except:
...             print "error" #substitute your own error handling
...     return _call_func
...
>>> @log_error
... def foo(a):
...     raise AttributeError
...
>>> foo(1)
error

Als u gebruik maken van log_error als decorateur op uw standpunt, zal het automatisch verwerken wat fouten gebeurd binnen het.

Het proces _uitzondering functie wordt aangeroepen voor bepaalde uitzonderingen (bv: assert (Valse) in views.py), maar proces _uitzondering krijgt niet opgeroepen voor andere fouten zoals ImportErrors (bijvoorbeeld: import thisclassdoesnotexist in urs.py). Ik ben nieuw in Django / Python. Is dit vanwege een onderscheid tussen run-time en compile-time fouten?

In Python, alle fouten zijn run-time fouten. De reden waarom deze problemen veroorzaakt is omdat deze fouten optreden onmiddellijk wanneer de module wordt ingevoerd voordat uw uitzicht ooit wordt genoemd. De eerste methode die ik geplaatst zal fouten als deze te vangen voor het debuggen. Je zou in staat zijn om iets uit te zoeken voor de productie, maar ik zou zeggen dat je ergere problemen hebben als je krijgt ImportErrors in een productie-app (en je bent niet doen van een dynamische importeren).

Een tool als pylint kan helpen elimineren dit soort problemen wel.

antwoordde op 27/03/2009 om 20:51
bron van user

stemmen
-1

Als u op een * nix systeem kon je

schrijven naar een log (bijv. mylog.txt) in python voer "tail -f mylog.txt" in de console

Dit is een handige manier om elke vorm van log te bekijken in de buurt van real-time

antwoordde op 28/03/2009 om 23:03
bron van user

stemmen
6

De process_exception functie wordt aangeroepen voor bepaalde uitzonderingen (bv: assert (Valse) in views.py), maar process_exception krijgt niet opgeroepen voor andere fouten zoals ImportErrors (bijvoorbeeld: import thisclassdoesnotexist in urs.py). Ik ben nieuw in Django / Python. Is dit vanwege een onderscheid tussen run-time en compile-time fouten?

Nee, het is gewoon omdat process_exception middleware alleen wordt ingeschakeld wanneer een uitzondering wordt opgeworpen in het zicht .

Ik denk dat DEBUG_PROPAGATE_EXCEPTIONS (zoals voor het eerst genoemd door Jason Baker) is wat je hier nodig hebt, maar ik denk niet dat je niet nodig om iets extra te doen (dwz sys.excepthook, etc) als je gewoon wilt de traceback gedumpt te troosten.

Als je iets wilt meer complex met de fout te doen (dwz dumpen naar een bestand of DB), zou de eenvoudigste aanpak van de zijn got_request_exception signaal , die Django stuurt enkele uitzondering-verzoek betrekking had, of het werd opgeheven in de weergave of niet.

De GET_RESPONSE en handle_uncaught_exception methoden van django.core.handlers.BaseHandler zijn leerzaam (en korte) lezen op dit gebied.

zonder enige extra exception handling toe te voegen aan de code. Ik heb nog nooit exception handling rond import statements gezien.

Kijk rond een beetje meer, zie je het gedaan (vaak in gevallen waarin u wilt het ontbreken van een afhankelijkheid in een bepaalde manier te behandelen). Dat gezegd hebbende, het zou natuurlijk heel lelijk als je moest gaan strooien extra try-behalve blokken over je code om een ​​globale verandering de manier waarop uitzonderingen worden behandeld maken!

antwoordde op 30/03/2009 om 05:53
bron van user


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more