C# 已存在的候选用户名是否可以引发异常?

C# 已存在的候选用户名是否可以引发异常?,c#,.net,exception,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(m

我刚刚将我的
AccountController
中的许多代码重构为
Authentication
提供者类。用于执行此检查的控制器:

if (_memberRepository.GetByUserName(model.UserName) != null)
{
    ModelState.AddModelError("", "The user name you have chosen already exists. Please choose another.");
    return View(model);
}
我已将其移动到我的
身份验证
类中,但在那里我无法访问
ModelState

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

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


我看到已经有了
MembershipCreateUserException
,但我想避免使用内置的成员资格功能。这不是一个好的OO,我觉得用它很脏。

你可以
发出一条错误消息。或者,向提供程序添加一个简单的方法,该方法只检查名称是否可用(然后可以异步调用)。然后,您已经将名称检查行为从注册逻辑中分离出来,因此它所要关心的就是添加用户。

这种情况是异常的,我会抛出一个异常。每次检查一个状态类或out参数对我来说似乎要脏得多(也是老派的)。
我认为为常见情况编写代码并处理异常情况更为简洁

简短回答:输入验证不应抛出

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


然而,您可能能够通过异常使事情正常工作:这只是一个最佳实践问题。

由于您预期会出现这种情况(用户输入的验证),所以异常似乎是错误的

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


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

为什么我要异步进行名称检查?我需要一个相当直接的结果。如果这是一个web应用程序(我想是的,因为你提到了会员工具),有一种方法可以检查名称是否可用,而不需要回发,这会创造更好的用户体验。网络上的往返可能很耗时,连接速度也很差。创建新用户时重复用户名绝对不是“例外”,而是一个预期的业务错误。创建时数据库链接断开将是异常的…-1:从原始代码中可以清楚地看出,该案例不是“异常的”,因为它用于验证看起来像用户输入的内容,这显然会导致错误。这只是异常的主观定义。如果使用状态代码,则需要将它们传播到顶部,这种传播会使代码更脏。我的推理是,您做出了错误的假设(或词语选择),并以此为基础构建了您的案例。通常情况下,预期的情况不被称为“例外”。。。如何处理这种情况是一个开放的问题,如果通过应用程序一致地应用,抛出异常是可以接受的预期错误策略(正如我说过的,我不会对我的应用程序这样做)。此外,还有一个与您相关的老问题:-我也阅读了一些回答。有赞成和反对。。。