Traceback in Templates falls Funktion nicht fehlerfrei läuft

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Hallo ich stehe auf den Schlauch,

Ich habe eine WSGI Anwendung. In dem ich Jinja2 Templates benutze. Aus denen heraus will ich nun Funktionen direkt ausführen, das mache ich auch. z.B

Code: Alles auswählen

{{time.time()}}
Nun will ich aber auch einen Traceback bekommen, wenn es mal eins gibt. Deshalb habe ich mir folgendes mit Hilfe von http://docs.python.org/library/traceback.html geschrieben:

Code: Alles auswählen

import traceback
import sys
def scall(code):
    try:
        exec code
    except:
        #return traceback.print_exc()
        exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
        erroroutput = traceback.format_exception(exceptionType, exceptionValue, exceptionTraceback) 
        return "<pre>%s</pre>"%"<br>".join(erroroutput)
Nun rufe ich die Funktion wie folgt auf:

Code: Alles auswählen

{{scall("time.time()")}}
Damit bekomme ich zwar das Traceback aber nichts (None) wenn es funktioniert hat.

Weiteres Porblem `scall` muss ich dort in den Code schreiben von wo aus ich auch das template lade sonst habe ich nicht die gleiche Umgebung und mein exec in scall kennt evl. die lib nicht.

PS: Ich möchte nicht soetwas wie DebuggedApplication(application)
PPS: Wenn es keine schönere Variante gibt werde ich jede Funktion umschreiben und ihnen einen richtiges Try Except schreiben wie es sich eigentlich gehört ;-)

mfG Lars
lunar

Darf man – ganz vorsichtig nur ;) – den Sinn und Zweck dieser Aktion hinterfragen? Während der Entwicklung sind interaktive Debugger wie Werkzeug doch viel sinnvoller, da man den Traceback mit viel schönerer Formatierung dort auch live untersuchen kann. Im Produktivsystem aber gehören Tracebacks auf jeden Fall ins Log und nicht in die Anzeige! Was du da tust, ergibt für mich vorne und hinten keinen Sinn ;)

Das eigentliche Problem: Du führst "time.time()" zwar aus, und das gibt auch brav einen Wert zurück. Der aber verschwindet im Nirvana, denn du gibst ihn nirgendwo zurück!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Unnötiger Einsatz von exec. Ich würde folgendes vorschlagen:

Code: Alles auswählen

def scall(f):
	try:
		return f()
	except:
		...
und dann `{{ scall(time.time) }}` benutzen.

Stefan
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

lunar hat geschrieben: Im Produktivsystem aber gehören Tracebacks auf jeden Fall ins Log und nicht in die Anzeige!
Tut das Python automatisch oder muss ich das selber Programmieren?!
lunar

Wenn überhaupt, dann geschieht das durch das Rahmenwerk, welches die Anwendung ausführt. Falls das Rahmenwerk diese Aufgabe nicht übernimmt, muss man Logging selbst implementiert, Python bietet dafür bereits ein fertiges Modul an.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

sma hat geschrieben:Unnötiger Einsatz von exec. Ich würde folgendes vorschlagen:

Code: Alles auswählen

def scall(f):
	try:
		return f()
	except:
		...
und dann `{{ scall(time.time) }}` benutzen.

Stefan
Sorry für die später Antwort aber es war Fest.

Da habe ich echt auf dem Schlauch gestanden, ich habe mich ständig gefragt wie ich das Problem umgehen kann, da `def scall(f())` die Funktion aufruft. Auf die Idee `f` zu übergeben bin ich nicht gekommen und die Argumente folgen lassen lassen war zu offensichtlich -.-

Danke.
sma hat geschrieben:Darf man – ganz vorsichtig nur Wink – den Sinn und Zweck dieser Aktion hinterfragen?
Darf man. Die Lösung ist nur für ein Admin Panel gedacht und auch nicht für immer, musst du nicht verstehen finds aber praktisch, weil quick&dirty. ;-)
lunar

Sr4l hat geschrieben:
sma hat geschrieben:Darf man – ganz vorsichtig nur Wink – den Sinn und Zweck dieser Aktion hinterfragen?
Darf man. Die Lösung ist nur für ein Admin Panel gedacht und auch nicht für immer, musst du nicht verstehen finds aber praktisch, weil quick&dirty. ;-)
Ich verstehe in der Tat nicht, wieso ist es praktisch ist, wenn man den Debugger umgeht und den Traceback mitten in der Seite anzeigt ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Ich verstehe in der Tat nicht, wieso ist es praktisch ist, wenn man den Debugger umgeht und den Traceback mitten in der Seite anzeigt ;)
Na weil Debugausgaben mitten auf der Seite 1A PHP-Feeling ergeben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ästhetik ;-)

*edit*
@leonidas: PHP fealing ala da hat jmd scheiße gecodet aber ich zeige dir trozdem was ich daraus gemacht habe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sr4l hat geschrieben:Ästhetik ;-)
Mit anderen Worten: Du hast noch nie die Debugger-Seite gesehen?
Sr4l hat geschrieben:PHP fealing ala da hat jmd scheiße gecodet aber ich zeige dir trozdem was ich daraus gemacht habe
Da bin ich gespannt :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Code: Alles auswählen

...<div class="<b>IMPORTANT ERROR</b> Fix this now or the server will explode! I warned you!">...
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Leonidas hat geschrieben:
Sr4l hat geschrieben:Ästhetik ;-)
Mit anderen Worten: Du hast noch nie die Debugger-Seite gesehen?
Doch ich nutze den Werkzeuge Debugger auch ich möchte ihn nur das er bei ein paar Funktionen die im Adminbereich aufgerufen werden nicht anspringt.

Es geht mir dabei hauptsächlich um meiner Mitbenutzer die ich mit der DONT PANIC Seite nicht überfordern möchte. Wenn ich nur das Kurze Standard Traceback in die Seite integriere können sie mir das leichter zu senden.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Da du deine Mitbenutzern nicht mit Debugger-Ausgaben 'überfordern' willst, würde ich ausnahmslos alle nicht gefangenen Exceptions in ne Log-Datei schreiben und dem Mitbenutzern ne "Sorry, ich arbeiten dran" Seite präsentieren. Dann sparst du ihnen auch die Mail-Schreiberei.
lunar

Sr4l hat geschrieben:Es geht mir dabei hauptsächlich um meiner Mitbenutzer die ich mit der DONT PANIC Seite nicht überfordern möchte. Wenn ich nur das Kurze Standard Traceback in die Seite integriere können sie mir das leichter zu senden.
Wieso müssen deine Mitbenutzer dir überhaupt den Traceback schicken? Hast du keinen Zugriff auf die Log-Dateien der Anwendungen?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Aktiv ist schon besser wenn sie sich bei mir melden, Log gucken wird vergessen und wirft fragen auf. Zudem ist Debuggen im Browser schon praktischer, wenn ich den Fehler vor mir habe will ich nicht wieder zu den Logs wechseln.

Ich nutze ja auch Werkzeuge Debugger, der sehr sehr gut ist. Wollte nur noch ne alternative, die ich jetzt ja auch habe.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

lunar hat geschrieben:
Sr4l hat geschrieben:Es geht mir dabei hauptsächlich um meiner Mitbenutzer die ich mit der DONT PANIC Seite nicht überfordern möchte. Wenn ich nur das Kurze Standard Traceback in die Seite integriere können sie mir das leichter zu senden.
Wieso müssen deine Mitbenutzer dir überhaupt den Traceback schicken? Hast du keinen Zugriff auf die Log-Dateien der Anwendungen?
Es ist gut jetzt oder? ;-)

Es wirft ja nun auch nicht alle 5Minuten nen Fehler, bisher sogar noch überhaupt keinen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich finds eigentlich am praktischsten Exceptions gemailt zu bekommen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten