0

在 web2py 中,假设我有以下 url:

www.example.com/customer/view/1

view()它由控制器中的函数支持,customer并显示数据库中 id 为 1 的客户。

view函数中,我想处理以下错误情况:

  1. 没有传递任何参数 ( /customer/view/) -> raise 404
  2. 传递了一个非整数参数 ( /customer/view/apple) -> raise 404
  3. 传递了一个整数参数,但数据库中不存在 ( /customer/view/999999) -> raise 404
  4. 发生应用程序错误,例如无法连接到数据库 -> 引发 500 异常

在控制器函数中以返回正确 HTTP 错误的方式处理这些情况的标准/规范/正确方法是什么?这是一个很常见的场景,我想每次都以正确和简洁的方式来做。

这几乎可以工作,只是它不区分 id not valid/existing 错误和任何其他错误:

def view():
    try:
        customer = db(db.customer.id==request.args(0, cast=int)).select()[0]
    except:
        raise HTTP(404, 'Cannot find that customer')

    return dict(customer=customer)
4

1 回答 1

1
def view():
    id = request.args(0, cast=int, otherwise=lambda: None)
    customer = db(db.customer.id == id).select().first()
    if not customer:
        raise HTTP(404, 'Cannot find that customer' if id
                   else 'Missing/invalid customer ID')
    return dict(customer=customer)

如果在 request.args() 中转换失败,默认情况下它将引发自己的 HTTP(404),但您将无法控制消息。因此,在这种情况下,您可以改为使用otherwise参数返回NoneNone如果 arg 缺失或为非整数,或者在数据库中未找到客户,则数据库查询将返回。

于 2013-09-25T15:07:50.300 回答