Was ist der richtige Weg, um Fehler von Klassen zu gerenderten html in Python passieren

StackOverflow https://stackoverflow.com/questions/2352201

  •  23-09-2019
  •  | 
  •  

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.

War es hilfreich?

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top