【发布时间】:2013-09-26 16:12:46
【问题描述】:
假设我在数据库中有一个向表中插入一行的存储过程。如果我尝试在表中插入违反主键约束的行,数据库显然会抛出异常。现在,我应该在数据库级别处理这个异常,还是可以将异常发送到客户端并在那里处理?哪一个是首选和更好的做法?
【问题讨论】:
标签: database exception-handling client
假设我在数据库中有一个向表中插入一行的存储过程。如果我尝试在表中插入违反主键约束的行,数据库显然会抛出异常。现在,我应该在数据库级别处理这个异常,还是可以将异常发送到客户端并在那里处理?哪一个是首选和更好的做法?
【问题讨论】:
标签: database exception-handling client
虽然我同意 rags 链接到的问题确实涵盖了在数据库中存在约束的原因,但我认为它不能完全回答您的具体问题,因为它没有涵盖如何处理从生成的异常数据库。
所以,我认为答案是“视情况而定”。
如果您正在接受来自客户端的输入并尝试使用此 SP 插入它而在 SP 内部没有生成任何其他数据,那么是的,您应该向客户端抛出某种异常,因为您的 SP 无法处理此异常而不良数据来自客户端。
即不要捕获您无法处理的异常。
另一方面,如果 SP 可能是问题的原因 - 假设它生成了一些构成 INSERT 一部分的数据,并且 this 数据导致问题,你实际上可以从中恢复——然后抓住它,恢复,客户不需要知道任何事情;如果您无法恢复,那么此时您可以将异常(或一些更通用的异常,在记录原始异常后)抛回给客户端,因为您对此无能为力。
顺便说一句,在您的对象验证中,拥有数据库架构中存在的相同约束的“软”版本并没有错 - 因为架构中的任何更改都需要更改您的映射对象,这是有道理的(无论如何对我来说)将您在数据库中定义的关系和结构约束视为映射对象模型必须遵守的契约。
【讨论】: