这是使用例外的正确方法吗?

时间:2011-01-24 17:56:34

标签: c# exception

我有一个会员资格例外,如下所示:

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并将其返回到视图。 建议替代方案吗?

5 个答案:

答案 0 :(得分:5)

例外情况仅适用于特殊情况。枚举中列出的错误似乎是相当标准的,我会选择不通过异常来表达它们。相反,我更喜欢TryXXX样式API而不是异常。

例如

public bool TryGetMembershipData(
  string user, 
  out Data data, 
  out MemberShipError error) {
  ...
}

答案 1 :(得分:3)

您似乎正在使用异常处理进行数据验证。这是一个糟糕的设计。在完成最终注册之前,您应该单独执行这些验证检查。

答案 2 :(得分:1)

糟糕的主意。例外通常只应用于“例外”案件。您也会遇到性能问题。

答案 3 :(得分:0)

这听起来可能不是PC,但我相信软件工程不是一种宗教,它会迫使你只是为了它而遵守严格的规则。当然,对于 Dos Donts 有理论上的解释,有很多认为有害的文章,但它们总是适用对你自己的情况

让我们务实:

  1. 您的MembershipException课程足够专业,而且最重要的是,通过MembershipError枚举很容易进行维护。

  2. 此外,异常处理的成本通常被高估:您的会员服务层毕竟不是实时飞行模拟器;偶尔登录失败不会使您的应用程序陷入困境。

  3. 保持这样:易于维护且易于阅读。

答案 4 :(得分:0)

说实话,这不是使用异常处理的最佳方式,一般规则是只有当您可以预期发生的事情时才使用Exception,您在此处显示的所有异常都可以像错误一样完美处理。如果您的服务将这些错误作为异常返回,则除了重做软件层以返回包含这些错误的消息之外,您无能为力。

如果你不能这样做那么你应该捕获逻辑层上不同catch的每个例外。