2008-09-02 113 views
12

如何处理应用程序中的数据库异常?
您是否在将数据传递给数据库之前验证数据,还是仅仅依靠数据库模式验证逻辑?
您是否尝试从某种数据库错误中恢复(例如超时)?数据库异常处理最佳实践

这里有一些方法:

  1. 验证传递到DB
  2. 左验证,数据库和处理DB异常正常
  3. 验证两侧
  4. 验证一些明显的制约业务之前数据逻辑并将复杂验证留给DB

您使用什么方法?为什么?

更新:

我很高兴看到越来越多的讨论。
让我们试着总结社区答案。

建议:

你还有什么说?这被转换为验证具体问题。我们错过了核心,即“与数据库相关的错误最佳实践”,哪些需要处理哪些以及哪些需要泡泡?

回答

1

一般来说,我尝试在输入数据后尽快验证数据。这样,我可以在点击“提交”或同等操作之后,提前给用户提供有用的信息。
当谈到进行数据库调用时,我希望我传递的数据应该相当好。
我试图在共享帮助程序方法的一个文件(或一组文件)中保持db调用,以使程序员(我或任何其他人添加调用)尽可能简单地向日志写入有关异常的详细信息,并且什么参数被传入等

2

我试图验证双方。我始终遵循的1规则永远不会来自用户的信任输入。根据这个结论,我通常会在表单/网页上进行一些前端验证,甚至不允许提交不正确的数据。这是一个钝器 - 这意味着您可以检查/解析值以确保日期字段包含日期。从那里,我通常会让我的业务逻辑检查数据条目是否在提交方式上有意义。例如,提交日期是否落入预期范围?提交的货币价值是否落入预期范围?最后,在服务器端,外键约束和索引可以捕获任何通过的错误,这将导致DB异常作为最后的手段,这可以由应用程序代码处理。我使用这种方法是因为它在调用数据库调用之前尽可能多地过滤错误。

3

您想减少不必要的行程到数据库,因此在应用程序内执行验证是一种很好的做法。此外,它还允许您处理最容易从以下位置恢复的数据错误:靠近用户界面(无论是在控制器中还是在用于简单应用程序的UI层内)输入数据的位置。

但是,有些数据错误无法以编程方式检查。例如,你无法验证相关数据存在的数据,而无需往返数据库。像这些数据错误应该由数据库通过使用关系,触发器等来验证。

如果处理数据库调用返回的错误是一件有趣的事情。您可以在数据层,业务逻辑层或UI层处理它们。在这种情况下,最好的做法是让这些错误在处理它们之前冒泡到最后一个负责任的时刻。例如,如果您有一个ASP.NET MVC Web应用程序,则您有三层(从下到上):数据库,控制器和UI(模型,控制器和视图)。应该允许数据层引发的任何错误冒泡到您的控制器中。在此级别,您的应用程序“知道”用户正在尝试执行的操作,并可以正确告知用户有关错误的信息,并提出处理错误的方法。试图从数据层内的这些错误中恢复,使得更难了解控制器内正在发生的事情。当然,在UI中放置业务逻辑并不被认为是最佳实践。

TL; DR:验证无处不在,在最后一个负责任的时刻处理验证错误。

0

我正在写的应用程序(我自从搬迁了)是内部胖客户端应用程序。
我会尽量保持客户端的业务逻辑,并对db进行更多的机械验证(即验证只与程序的运行能力相关,而不是更高级的验证)。
总之,验证你可以在哪里,并尽量保持相关类型的验证。

+0

[@hamishmcn](http://stackoverflow.com/questions/39371/database-exception-handling-best-practices#39406)。好点,在业务逻辑层进行验证的一个原因是创建用户友好的用户界面。但在多个地方进行这些验证会打破DRY原则。你如何设法保持数据库和客户端验证同步? – aku 2008-09-02 12:50:11

5

@aku:干是很好,但它并不总是可能的。验证就是其中一个地方,因为您将有三个完全不同且无关的地方,其中验证不仅可能,而且绝对需要:在UI内,在业务逻辑内以及在数据库内。

想象一个Web应用程序。你想减少到服务器的旅程,所以你包括客户端数据录入的javascript验证。但是您不能相信用户输入的内容,因此您必须在触摸数据库之前在您的业务逻辑中执行验证。数据库必须有自己的验证,以防止数据损坏。

有没有干净的方法来统一这三种不同类型的验证在一个单一的组件。

有被做了一些尝试,以统一像类似政策注射器内验证交叉责任在P & P组的Policy Injection Application Block他们Validation Application Block结合,但这些仍然是基于代码。如果您的验证不在代码中,您仍然必须单独维护并行逻辑...

2

对象关系映射(ORM)工具,如NHibernate(或更好的,ActiveRecord)可帮助您避免大量通过允许将数据模型作为适当的C#类构建到您的代码中进行验证。您也可以避免访问数据库,这要归功于框架中内置的优秀缓存和验证模型。

4

在客户端和数据库端都有一个杀手原因需要验证,那就是安全。特别是当你开始使用AJAX的东西,可破解的URL和其他东西,使您的网站(在这种情况下)更容易对用户黑客。

在客户端进行验证以提供流畅的体验,以及早告诉用户更正他们的输入。也可以在数据库中验证(或在业务逻辑中,如果这被认为是数据库的完全安全网关)以确保您的数据库安全。