我有一个会员资格例外,如下所示:
public enum MembershipError
{
EmailNotFound,
EmailNotConfirmed,
IncorrectPassword,
EmailExists
}
public class MembershipException : ApplicationException
{
public MembershipError MembershipError { get; set; }
public MembershipException(MembershipError membershipError)
: base(Enum.GetName(typeof (MembershipError), membershipError))
{
MembershipError = membershipError;
}
}
我应该在我的例外中使用枚举还是为每个枚举设置一个例外?因为那时我会在捕获异常时使用逻辑:
try
{
}
catch (MembershipException exception)
{
switch (exception.MembershipError)
{
case MembershipError.EmailExists:
break;
//etc.
}
}
我的服务层抛出这些异常,动作中的web层/捕获这些异常,生成正确的json并将其返回到视图。 建议替代方案吗?
答案 0 :(得分:5)
例外情况仅适用于特殊情况。枚举中列出的错误似乎是相当标准的,我会选择不通过异常来表达它们。相反,我更喜欢TryXXX
样式API而不是异常。
例如
public bool TryGetMembershipData(
string user,
out Data data,
out MemberShipError error) {
...
}
答案 1 :(得分:3)
您似乎正在使用异常处理进行数据验证。这是一个糟糕的设计。在完成最终注册之前,您应该单独执行这些验证检查。
答案 2 :(得分:1)
糟糕的主意。例外通常只应用于“例外”案件。您也会遇到性能问题。
答案 3 :(得分:0)
这听起来可能不是PC,但我相信软件工程不是一种宗教,它会迫使你只是为了它而遵守严格的规则。当然,对于 Dos 和 Donts 有理论上的解释,有很多认为有害的文章,但它们总是适用对你自己的情况?
让我们务实:
您的MembershipException
课程足够专业,而且最重要的是,通过MembershipError
枚举很容易进行维护。
此外,异常处理的成本通常被高估:您的会员服务层毕竟不是实时飞行模拟器;偶尔登录失败不会使您的应用程序陷入困境。
保持这样:易于维护且易于阅读。
答案 4 :(得分:0)
说实话,这不是使用异常处理的最佳方式,一般规则是只有当您可以预期发生的事情时才使用Exception,您在此处显示的所有异常都可以像错误一样完美处理。如果您的服务将这些错误作为异常返回,则除了重做软件层以返回包含这些错误的消息之外,您无能为力。
如果你不能这样做那么你应该捕获逻辑层上不同catch的每个例外。