django 多个try/except,在第一个异常处理之后,下一个异常处理

ztyzrc3y  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(187)

我有两个try except块,第二个块触发第一个块的异常。
我期望第一个处理第一个异常,第二个不触发该异常。
第二个try/catch块捕获第一个块中生成的异常,除非我处理它,为什么?有人能帮我解决这个问题吗?

try:
    if isinstance(request.data['name'],str):
        progetto.name = request.data['name']   
        progetto.save()
    else:
        raise TypeError('Validation error')
except TypeError as te:
    print('type error catched error: ',te)
    errori.append({'name': str(te)})
except Exception as e:
    print('name catched error: ',e)
    errori.append({'name': str(e)})

try:
    progetto.expiration = request.data['expiration']
    progetto.save()
except Exception as ex:
    print('exp block catched error: ',ex)
    errori.append({'expiration': str(ex)})
lp0sw83n

lp0sw83n1#

第二个try/catch块捕获了第一个块中生成的异常,除非我处理它,为什么?有人能帮我解决这个问题吗?
不是真的不。但是,您设置了progetto.name的名称,如果该名称无效,您将其保存,除了向日志添加错误之外,不会发生太多事情。
然后添加.expiration,但.name仍然存在,因此如果名称部分存在完整性错误,则无效名称仍然存在,因此第二次引发此错误。
但是使用保存机制来发现无效数据是一个非常糟糕的主意。例如,在这种情况下,如果没有设置.expiration,数据库可能会拒绝它,所以你不能真正知道是什么导致了问题。
另一件事是,很多验证不能在数据库端(有效地)完成,例如**EmailField**[Django-doc]是一个CharField,在Django端有验证器,因此数据库不会检查输入的数据是否确实是电子邮件地址,但Django可以。
你在这里尝试手动做的事情已经存在了,这是( Model ) Form [Django-doc]的任务,或者在Django REST框架的情况下是Serializer [drf-doc]。这些都考虑到了Django端和数据库端的各种验证器(比如CheckConstraint s和UniqueConstraint s来验证项目确实存在)。
一个表单被设计为在所有字段上运行验证,并生成一个错误集合:使用my_form.errors,您将获得一个字典,它将字段名称Map到可能的错误列表上。
手动处理请求数据很麻烦:不能保证请求包含所有必需的数据项,并且这些数据项都是正确的格式。正是因为它很麻烦,而且存在严重的安全风险,手动执行几乎从来都不是一个好主意。

相关问题