Как правильно передавать ошибки из классов в рендеринг HTML в Python

1

Я выполняю всю мою проверку формы в классе и хотел бы получить ошибки от класса до отображаемого html. Один из подходов, о котором я думал, - создать глобальную переменную "c", которая сохранит все ошибки и установит их из класса, поскольку я все же хочу, чтобы отдельные методы возвращали false, когда они терпят неудачу. Вот пример кода:

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

Есть ли лучший или предпочтительный способ сделать это?

Спасибо.

Теги:
mako
pylons

3 ответа

1
Лучший ответ

Мне нравится использовать словарь для хранения ошибок и предупреждений. Затем я могу либо показать все ошибки в верхней части формы, либо в строке. Я также определяю переменные error и warning, поэтому я могу легко разделить их на две части.

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
1

Да, определенно, и мое предложение состоит в том, чтобы вообще не возвращать коды статуса.

Вообще говоря, существует много литературы против использования кодов состояния и глобальных переменных для хранения деталей для обработки ошибок в среде высокого уровня, такой как Python.
Ned Batchelder написал очень хорошую статью по этому вопросу; Я настоятельно рекомендую вам прочитать эту страницу для сквозных списков причин, почему обработка исключений обычно считается превосходным методом.

Но, поскольку мы говорим о Python, официальный способ обмениваться исключениями и ошибками - это обработка исключений. Период.
Используя любой другой способ, вы сделаете свой код против общих ожиданий для кода Python, то есть его будет труднее читать и поддерживать.

  • 0
    Есть ли у вас пример кода для иллюстрации, например, проверки пробельных символов в поле имени и проверки адреса электронной почты с использованием исключений вместо возврата кодов состояния? Благодарю.
1

В контексте веб-приложения вы можете просто заполнить 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')

Где 'mytemplate.mako' содержимое файла:

% if c.error:
    error: ${c.error}
% endif

В общем коде python вы можете:

Возвращает кортеж

Вы можете вернуть кортеж из своей функции (это не предпочтительный путь):

class Error(Exception):
    pass

def isvalid(something):
    return False, Error("'%s' is invalid" % (something,))

Пример:

ok, err = isvalid(object())
if not ok:
   print err

Поднять исключение

Если непосредственный вызывающий объект не должен обрабатывать ошибку из вашей функции, тогда исключение может использоваться для передачи информации об ошибке в стек.

def do_stuff(something):
    if not something.isready():
       raise Error("'%s' is not ready to do stuff" % (something,))

Пример:

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

Пропустить обратный вызов

def do_stuff(something, onerror=lambda err: None):
    if not something.isready():
       onerror(Error("'%s' is not ready to do stuff" % (something,)))

Пример:

do = lambda: do_stuff(C(), onerror=repeat)
def repeat(err):
    """Repeat until success."""
    print err
    time.sleep(5) 
    do() # possible infinite loop 
do()
  • 0
    Спасибо за подробный ответ. Это действительно для веб-приложения. Как бы вы пошли о передаче ошибок из метода в модели в контроллер и в конечном итоге в шаблон? Я хотел бы поставить все мои проверки ошибок в классах, если это возможно. Благодарю.
  • 0
    @ensnare: Вы можете использовать validate декоратора , как описано в wiki.pylonshq.com/display/pylonsdocs/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню