Jelentkezzen minden hibát a konzol vagy fájlt Django helyszínen

szavazat
13

Hogyan juthatok Django 1.0 írni minden hibát, hogy a konzol vagy a log fájlt, ha fut runserver hibakeresés módban?

Megpróbáltam egy köztes osztály process_exception módon működnek az elfogadott válasz erre a kérdésre:

Hogyan jelentkezzen szerver hibák Django oldalak

A process_exception függvényt az néhány kivételtől eltekintve (pl érvényesíteni (hamis) views.py), de process_exception nem kapok úgynevezett egyéb hibákat, mint ImportErrors (pl: import thisclassdoesnotexist a urs.py). Új vagyok a Django / Python. Ez azért, mert bizonyos megkülönböztetése futásidejű és fordítási időben hibát? De akkor azt várnánk runserver panaszkodni, ha ez egy fordítási hiba, és nem.

Láttam Simon Willison fantasztikus előadást Django hibakeresés ( http://simonwillison.net/2008/May/22/debugging/ ), de én nem láttam olyan lehetőség, hogy jól működne nekem.

Abban az esetben ez lényeges, írok egy Facebook alkalmazás és a Facebook maszkok HTTP 500 hibát a saját üzenet megjelenítése helyett Django awesomely tájékoztató 500 oldalas. Szóval kell egy utat minden típusú hibák írandó a konzol vagy a fájl.

Edit: Azt hiszem, a várakozás, hogy ha Django visszatérhet a 500 error page sok részlet, amikor van egy rossz import (ImportError) a urls.py, akkor képesnek kell lennie arra, hogy írjon ugyanolyan részletességgel a konzolt, vagy egy fájlt, kelljen hozzáadni az kivételkezelés a kódot. Még soha nem láttam kivételkezelés körül import nyilatkozatokat.

Köszönöm, Jeff

A kérdést 27/03/2009 18:30
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
2

Először is, nagyon kevés a fordítási hibákat, hogy látni fogod a kivétel napló. Ha a Python kód nem érvényes szintaxist, meghal régen naplók nyitható meg írásra.

A Django runserver módban a „print” nyilatkozatot ír a standard kimenetre, ami látható. Ez nem egy jó hosszú távú megoldást, azonban így nem számítanak rá.

Amikor Django alatt futó Apache, azonban attól függ, milyen plug-in, amit használ. mod_python nem könnyű kezelni. mod_wsgi lehet kényszerítettek küldő stdout és stderr egy log fájlt.

A legjobb az, azonban a naplózási modult. Tedd egy inicializáló be a felső szintű urls.pykonfigurálására fakitermelés. (Vagy talán ön settings.py)

Ügyeljen arra, hogy minden modul egy logger írásához üzeneteket.

Ügyeljen arra, hogy minden internetes szolgáltatás hívni, hogy van egy try / except blokkba körül, és írsz a kivételeket a napló.

Válaszolt 27/03/2009 19:51
a forrás felhasználó

szavazat
13

Ez egy kicsit extrém, de hibakeresés céljából, akkor kapcsolja be a DEBUG_PROPAGATE_EXCEPTIONSbeállítást. Ez lehetővé teszi, hogy hozzanak létre saját hibakezelés. A legegyszerűbb módja annak, hogy hozzanak létre az említett hibakezelés lenne felülírni sys.excepthook . Ez megszünteti a kérelmet, de működni fog. Lehetnek dolog, amit tehetünk, hogy ez nem öli meg az alkalmazást, de ez attól függ, hogy milyen platformon te telepítésével ezt. Akárhogy is, soha nem használja ezt a termelés!

A termelés, a te elég sok lesz, hogy széles körű hibakezelés helyett. Az egyik technika, amit használt, valahogy így:

>>> 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

Ha log_error a lakberendező a nézetet, akkor automatikusan kezeli bármilyen hibákat történt benne.

A folyamat _kivétel függvényt az néhány kivételtől eltekintve (pl érvényesíteni (hamis) views.py), de eljárás _kivételével nem kapok úgynevezett egyéb hibákat, mint ImportErrors (pl: import thisclassdoesnotexist a urs.py). Új vagyok a Django / Python. Ez azért, mert bizonyos megkülönböztetése futásidejű és fordítási időben hibát?

Python, minden hiba futásidejű hibákat. Az ok, amiért ezt a problémát okozó azért van, mert ezek a hibák azonnal, amikor a modul előtt hozzák meg a nézetet sem hívta. Az első módszer, amit írt is a hibákat, mint ezek a hibakeresés. Akkor lehet, hogy kitalálok valamit a termelés, de azt állítják, hogy van rosszabb problémák, ha kapsz ImportErrors egy éles alkalmazás (és nem csinál semmilyen dinamikus importáló).

Egy eszköz, mint pylint segítségével megszünteti az ilyen problémák ellenére.

Válaszolt 27/03/2009 20:51
a forrás felhasználó

szavazat
-1

Ha egy * nix rendszer meg tudná

írj egy naplót (pl. mylog.txt) python azután a „tail -f mylog.txt” a konzol

Ez egy praktikus módja annak, hogy megtekinthesse bármilyen log közel valós idejű

Válaszolt 28/03/2009 23:03
a forrás felhasználó

szavazat
6

A process_exception függvényt az néhány kivételtől eltekintve (pl érvényesíteni (hamis) views.py), de process_exception nem kapok úgynevezett egyéb hibákat, mint ImportErrors (pl: import thisclassdoesnotexist a urs.py). Új vagyok a Django / Python. Ez azért, mert bizonyos megkülönböztetése futásidejű és fordítási időben hibát?

Nem, ez csak azért, mert process_exception middleware csak akkor keresik, ha egy kivétel van emelve a nézet .

Azt hiszem DEBUG_PROPAGATE_EXCEPTIONS (mint említettük először Jason Baker), amire szüksége van, de nem hiszem, hogy nem kell semmit tennie további (azaz sys.excepthook stb), ha csak azt a lőfegyverét dömpingelt vigasztalni.

Ha azt szeretnénk, hogy bármit bonyolultabb a hiba (azaz dump file vagy DB), a legegyszerűbb lenne a got_request_exception jel , amely Django küld bármilyen kérése kapcsolatos kivétel, hogy emelték a nézet, vagy sem.

A get_response és handle_uncaught_exception módszerek django.core.handlers.BaseHandler tanulságos (és rövid) olvasás ezen a területen.

anélkül, hogy hozzá semmilyen kiegészítő kivételkezelés a kódot. Még soha nem láttam kivételkezelés körül import nyilatkozatokat.

Nézz körül egy kicsit, látni fogod tenni (gyakran olyan esetekben, amikor a kezelni kívánt hiányában a függőség valamilyen különleges módon). Igaz, akkor természetesen elég csúnya, ha kellett menni locsolás további try-except blokk az egész a kódot, hogy a globális változások, hogyan kivételeket kezelni!

Válaszolt 30/03/2009 05:53
a forrás felhasználó


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