我有两个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)})
1条答案
按热度按时间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到可能的错误列表上。手动处理请求数据很麻烦:不能保证请求包含所有必需的数据项,并且这些数据项都是正确的格式。正是因为它很麻烦,而且存在严重的安全风险,手动执行几乎从来都不是一个好主意。