我应该在数据库端还是客户端捕获异常?

时间:2013-09-25 09:47:38

标签: database exception-handling client

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

1 个答案:

答案 0 :(得分:1)

虽然我同意与rags相关的问题确实涵盖了数据库中存在约束的原因,但我认为它并不能完全回答您的具体问题,因为它不包括如何处理由数据库。

所以,我认为答案是“它取决于”。

如果您接受来自客户端的输入并尝试使用此SP插入它而不在SP内部生成任何其他数据,那么是的,您应该将某种异常返回给客户端,因为您的SP无法处理此异常坏数据来自客户端。

  

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

另一方面,如果SP可能是导致问题的原因 - 让我们说它会生成一些构成INSERT一部分的数据,它就是这个导致问题的数据,您实际上可以从中恢复 - 然后捕获它,恢复,并且客户端不需要知道任何有关它的信息;如果你无法恢复,那么你可以通过各种方式将异常(或一些更广泛的例外,在记录原文之后)抛回客户端,因为你无法做更多关于它的事情。

顺便提一下,在对象验证中使用数据库模式中存在的相同约束的“软”版本没有任何问题 - 因为模式中的任何更改都需要更改映射对象,这是有道理的(无论如何,将你在数据库中定义的关系和结构约束视为映射对象模型必须遵守的契约。