【问题标题】:Is this a proper way to use exceptions?这是使用异常的正确方法吗?
【发布时间】:2011-01-24 17:56:33
【问题描述】:

我有一个成员资格异常,如下所示:

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 并将其返回给视图。 请推荐一个替代方案?

【问题讨论】:

    标签: c# exception


    【解决方案1】:

    异常应该只用于异常情况。您枚举中列出的错误似乎是相当标准的,我不会选择通过异常来表达它们。相反,我更喜欢 TryXXX 风格的 API 而不是异常。

    例如

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

    【讨论】:

    • 我要把这 2 个 out 合并到一个类中并返回它。
    • @Lolcoder:但是 bool 返回值呢?这是使用 Try 方法的重点。另外,考虑使用Tuple 而不是创建一个新类。
    【解决方案2】:

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

    【讨论】:

    • 我的服务层抛出这些异常,web层/在动作中捕捉到这些,生成正确的json并返回给视图。
    • 你对服务层有控制权吗?
    【解决方案3】:

    坏主意。例外通常只应在“例外”情况下使用。您也会遇到性能问题。

    【讨论】:

      【解决方案4】:

      这听起来可能不是很 PC,但我相信软件工程不是一种宗教,它会强迫你为了它而遵守严格的戒律。当然,对于 DosDonts 有理论上的解释,有大量 Considered Harmful 文章,但它们总是适用自己的情况

      让我们务实一点:

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

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

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

      【讨论】:

        【解决方案5】:

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

        如果您不能这样做,那么您应该在逻辑层的不同捕获中捕获每个异常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-29
          • 2022-01-23
          • 2014-12-17
          • 2012-05-11
          • 2018-12-31
          • 2021-04-29
          • 1970-01-01
          相关资源
          最近更新 更多