我认为你在这里没有错误,但违反了商业规则。
我喜欢来区分他们两个,是第一部分意外情况(如数据库连接如损失)以及后来的一些场景,你知道它可能发生。
对于错误,我认为合适的是以通用的方式通知用户(例如,“出现意外错误”),因为它的用户不能纠正或不需要详细信息。
在另一方面,业务规则是什么,用户可能了解并能采取措施纠正(在这里,用户名约束)。所以它应该被通知给用户。
在我工作的项目,我们有一个类型的异常,BusinessException
的。我们用一条消息来说明它是什么问题,并以可读的格式呈现。我们不明确地尝试捕获这些异常,但使用处理程序来管理它们。如果您使用的是MVC,那么您可以在其中添加一个扩展挂钩。
对于其他类型的异常,它是一个记录栈跟踪(即EventViewer)的好习惯,但不会给用户提供详细信息。
在这种情况下,我会做到以下几点:
- 有一个按钮检查名称允许用户预先确认的名称。
- 验证名称的地方取决于您希望具有应用程序业务逻辑的位置。在数据库上,使用存储过程是一种方法,但如果您使用EF,这意味着您想从数据访问中进行抽象。相反,你可以自己写这个验证,使用
LINQ
(类似于Context.Users.SingleOrDefault(x => x.Name == name)
),然后检查它是否返回null或者某个用户。你可能认为这个验证不是必须的,因为你已经有了DB约束,但是这样做,逻辑
- 从EF中捕获异常可能很麻烦,因为您需要检查SQL错误代码以确定它是否违反约束条件或其他错误。即使您确定这一点,您也需要转换该消息到用户友好的一个。
我希望这可以帮助你在你的决定!
谢谢你这样的完整答案。正如你所说,我将研究LINQ验证。我完全同意你的'企业对内部'的错误观点 – sha