繁体   English   中英

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

[英]Is this a proper way to use exceptions?

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

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

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

例如

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

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

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

这可能听起来不是PC,但我相信软件工程不是一种宗教,它会迫使你只是为了它而遵守严格的规则。 当然,有关DosDonts的理论解释,有大量被认为是有害的论文, 但它们是否总是适用于你自己的案例

让我们务实一点:

  1. 您的MembershipException类足够专业,而且最重要的是,使用它的MembershipError枚举很容易维护它。

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

保持这样:易于维护和易于阅读。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM