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

有没有更好或首选的方法来做到这一点?

谢谢。

4

3 回答 3

1

我喜欢使用字典来保存错误和警告。然后我可以在表单顶部或内联显示所有错误。我还定义了变量errorwarning变量,这样我就可以很容易地将两者区分开来。

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
于 2010-02-28T20:10:26.673 回答
1

是的,当然,我的建议是完全避免返回状态代码。

一般来说,有很多文献反对在 Python 等高级环境中使用状态码和全局变量来保存处理错误的详细信息。
Ned Batchelder就这个主题写了一篇非常好的文章;我强烈建议您阅读该页面,了解异常处理通常被认为是一种优越方法的原因列表。

但是,正如我们在谈论 Python 时,传达异常和错误的官方方式是通过异常处理。时期。
使用任何其他方式,都会使您的代码违背对 Python 代码的共同期望,这意味着它将更难阅读和维护。

于 2010-02-28T20:11:54.003 回答
1

在 Web 应用程序的上下文中,您可以只填充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()
于 2010-02-28T21:19:05.473 回答