0

假设我在数据库中有一个存储过程,它将一行插入到表中。如果我尝试在表中插入违反主键约束的行,数据库显然会抛出异常。现在,我应该在数据库级别处理这个异常,还是可以将异常发送到客户端并在那里处理?哪一个是首选和更好的做法?

4

1 回答 1

1

虽然我同意 rags 链接的问题确实涵盖了在数据库中存在约束的原因,但我认为它不能完全回答您的具体问题,因为它没有涵盖如何处理从数据库生成的异常。

所以,我认为答案是“视情况而定”。

如果您正在接受来自客户端的输入并尝试使用此 SP 将其插入而在 SP 内部没有生成任何其他数据,那么是的,您应该向客户端抛出某种异常,因为您的 SP 无法处理此异常和错误数据来自客户端。

不要捕获您无法处理的异常。

另一方面,如果 SP 可能是问题的原因——假设它生成了一些数据,这些数据构成了问题的一部分,INSERT正是这些数据导致了问题,你实际上可以从中恢复——然后抓住,恢复,客户端不需要知道任何事情;如果您无法恢复,那么此时您可以将异常(或一些更通用的异常,在记录原始异常后)抛回客户端,因为您对此无能为力。

顺便说一句,在您的对象验证中,拥有数据库架构中存在的相同约束的“软”版本并没有错 - 因为架构中的任何更改都需要更改映射对象,这很有意义(无论如何对我来说) 将您在数据库中定义的关系和结构约束视为映射对象模型必须遵守的契约。

于 2013-09-26T08:12:46.607 回答