我认为您在这里没有错误,而是违反了业务规则。
我喜欢区分这两种情况,首先是一些意外情况(例如数据库连接丢失),然后是您知道可能发生的一些情况。
对于错误,我认为适当的是以通用方式通知用户(例如,“发生意外错误”),因为用户无法更正也不需要详细信息。
另一方面,业务规则是用户可能理解并可以采取行动纠正的东西(这里是用户名约束)。所以应该通知用户。
在我从事的项目中,我们有一种异常,BusinessException
. 我们抛出一条消息,指出问题出在哪里,并以人类可读的格式呈现。我们没有明确地尝试捕获这些异常,而是使用处理程序来管理它们。如果您使用的是 MVC,则可以使用扩展挂钩。
对于其他类型的异常,将堆栈跟踪记录在某处(即 EventViewer)是一个很好的做法,但不向用户提供详细信息。
在这种情况下,我会执行以下操作:
- 有一个按钮检查名称以允许用户预先验证名称。
- 验证名称的位置取决于您希望将应用程序的业务逻辑放在何处。在 DB 上,使用存储过程是一种方法,但如果您使用的是 EF,这意味着您要从数据访问中抽象出来。相反,您可以自己编写此验证,使用
LINQ
( 之类的Context.Users.SingleOrDefault(x => x.Name == name)
,然后检查它是否返回 null 或某个用户。您可能认为此验证不是必需的,因为您已经有了数据库约束,但是这样做,逻辑仍然存在您的应用程序的代码。
- 从 EF 捕获异常可能会很麻烦,因为您需要检查 SQL 错误代码以确定它是违反约束还是其他错误。即使您确定了这一点,您也需要将消息转换为用户友好的消息。
我希望这对您的决定有所帮助!