Was ist der richtige Weg, um Fehler von Klassen zu gerenderten html in Python passieren
Frage
Ich fahre all meine Formularvalidierung in einer Klasse, und möchte in der Lage sein, die Fehler aus der Klasse des gerenderten html zu erhalten. Ein Ansatz Ich dachte über eine globale Variable „c“ zu schaffen war, dass alle Fehler speichern würde und sie setzen innerhalb der Klasse, da ich immer noch die einzelnen Methoden wollen als falsch zurück, wenn sie scheitern. Hier ist ein Beispielcode:
class User():
def add(self):
#Check that e-mail has been completed
try:
#Validate e-mail address
if (isAddressValid(self.email)):
c.error = 'Invalid e-mail address'
return 0
except NameError:
c.error = 'No e-mail address specified'
return 0
Gibt es eine bessere oder bevorzugte Art und Weise, dies zu tun?
Danke.
Lösung
Ich mag ein Wörterbuch verwenden, um die Fehler und Warnungen zu halten. Dann kann ich zeigen, entweder alle Fehler am oberen Rand des Formulars oder Inline. Ich auch error
und warning
Variablen definieren, damit ich einfach die beiden auseinanderhalten kann.
class User(object):
def __init__(self):
self.messages = {}
def add(self):
error = False
warning = False
#Check that name has a space
try:
if (self.name.find(' ') == -1):
warning = True
self.messages['email'] = {'type': 'warning',
'msg': 'Your name has no space.'}
except NameError:
error = True
self.messages['email'] = {'type': 'error',
'msg': 'You have no name.'}
#Check that e-mail has been completed
try:
#Validate e-mail address
if (isAddressValid(self.email)):
error = True
self.messages['email'] = {'type': 'error',
'msg': 'Invalid e-mail address'}
except NameError:
error = True
self.messages['email'] = {'type': 'error',
'msg': 'No e-mail address specified'}
return error, warning
Andere Tipps
Ja, auf jeden Fall, und mein Vorschlag ist, Statuscodes überhaupt zu vermeiden zurück.
Im Allgemeinen gibt es eine Menge Literatur gegen Statuscodes und globale Variablen zu halte Details für Fehler in hohem Niveau Umgebung wie Python Handhabung.
Ned Batchelder hat geschrieben ein sehr guten Artikel zu diesem Thema ; Empfehle ich Ihnen sehr, dass die Seite für eine durch Listen von Gründen zu lesen, warum die Ausnahmebehandlung in der Regel eine bessere Methode angesehen wird.
Aber, wie wir über Python sprechen, den offiziellen Weg, um Ausnahmen zu kommunizieren und Fehler, ist durch die Ausnahmebehandlung. Period.
Die Verwendung eine andere Weise wird Ihren Code gegen die gemeinsame Erwartungen für Python-Code machen, das heißt, es wird schwieriger zu lesen und warten.
Im Rahmen einer Web-Anwendung, die Sie konnte nur bevöl tmpl_context
.
from pylons import tmpl_context as c
from yourproject.lib.base import BaseController, render
class MyController(BaseController):
def index(self):
c.error = 'Invalid e-mail address'
return render('/mytemplate.mako')
Wo 'mytemplate.mako'
Dateiinhalt ist:
% if c.error:
error: ${c.error}
% endif
In generic Python-Code können Sie:
Zurück ein Tupel
Sie können ein Tupel aus Ihrer Funktion zurückgeben (es ist nicht bevorzugt, Art und Weise):
class Error(Exception):
pass
def isvalid(something):
return False, Error("'%s' is invalid" % (something,))
Beispiel:
ok, err = isvalid(object())
if not ok:
print err
Heben Sie eine Ausnahme
Wenn ein sofortiger Anrufer soll nicht einen Fehler von Ihrer Funktion zu handhaben kann eine Ausnahme verwendet werden, um Informationen über den Fehler passieren, den Stapel.
def do_stuff(something):
if not something.isready():
raise Error("'%s' is not ready to do stuff" % (something,))
Beispiel:
class C(object):
def isready(self):
return False
def run():
# no error handling here
do_stuff(C())
# do something else
try: run()
except Error, e:
print e
Pass Rückruf
def do_stuff(something, onerror=lambda err: None):
if not something.isready():
onerror(Error("'%s' is not ready to do stuff" % (something,)))
Beispiel:
do = lambda: do_stuff(C(), onerror=repeat)
def repeat(err):
"""Repeat until success."""
print err
time.sleep(5)
do() # possible infinite loop
do()