候选用户名是否存在抛出异常的理由?

时间:2012-07-02 06:17:43

标签: c# .net exception

我刚刚将AccountController中的大量代码重构为Authentication提供程序类。用于执行此检查的控制器:

if (_memberRepository.GetByUserName(model.UserName) != null)
{
    ModelState.AddModelError("", "The user name you have chosen already exists. Please choose another.");
    return View(model);
}

我已将其移至我的Authentication课程,但我无法访问ModelState

if (_memberRepository.GetByUserName(newMember.LoginName) != null)
{
    // Panic stations!!
}

我应该:

a)返回描述新方法的状态或结果的类?我觉得这太复杂了。 b)抛出异常(可能是ArgumentException?),表示我反对注册重复的用户名?这是快速而简单的,但它与使用业务逻辑的例外

相关

我看到已有MembershipCreateUserException,但我想避免使用内置会员功能。这不是好OO,我觉得使用它很脏。

4 个答案:

答案 0 :(得分:2)

简短回答:输入验证永远不应该抛出。

长答案:“您选择的用户名已经存在”是一种预期且可预测的错误,应该优雅地处理而不抛弃。它与登录时的错误密码没有什么不同。 如果您无法创建新用户,则应该抛出异常,因为数据库无法访问,例如。

尽管如此,你或许可以通过例外来解决问题:这只是最佳实践的问题。

答案 1 :(得分:1)

您可以out出现错误消息。或者,向提供程序添加一个简单的方法,除了检查名称是否可用(然后可以异步调用)之外什么都不做。然后,您已经将名称检查的行为与注册逻辑隔离开来,因此所有必须关注的是添加用户。

答案 2 :(得分:1)

这种情况很特殊,我会抛出异常。每次检查状态类或out参数对我来说(以及oldschool)都会变得更脏。 我认为更清洁的是为常见案例编写代码并处理具有异常的特殊情况。

答案 3 :(得分:0)

看起来异常是错误的,因为你期望这种情况(验证用户输入)。

我会创建单独的方法,只需检查具有此名称的用户是否存在。

您可以尝试重命名现有方法,以明确如果用户不存在,将返回一些特殊(null?)值。