c# - 异常处理——这是好的做法吗?

标签 c# .net exception exception-handling

我想知道我要做的是好事还是坏事。我有那个课:

public class Element : IElement
{
    public float? Max { get; private set; }

    public float? Min { get; private set; }

    public float? Average { get; private set; }

    public bool HasValue { get; private set; }


    public void SetRange(float? min, float? max)
    {
        if (min >= max)
        {
           throw new WrongElementValueException("Min must be greater than max!");
        }
        else if (min < 0f || max < 0f)
        {
           throw new WrongElementValueException("Min/max must be greater than 0!");
        }
        else if (min > 100f || max > 100f)
        {
           throw new WrongElementValueException("Min/max must be lesser than 0!");
        }
        else
        {
            Min = min;
            Max = max;
            Average = (min + max)/2f;
            HasValue = true;
        }
    }
}

用户将使用 SetRange() 方法设置值。但是他有一些限制,比如 Min 必须大于 Max,并且两者都不能大于 100 或小于 0。

我应该在这个地方使用那些异常(exception)吗?还是有更好的方法来处理错误的用户输入? 我希望我的问题不是笼统的。

最佳答案

这是一种适当的做法,是的。

虽然我想消费代码会期待 ArgumentException 而不是这种异常类型,但这可能是一个相对次要的问题。

当输入无效,并且对象无法以其他方式有意义地继续时,抛出异常是一种适当且预期的响应。正确使用对象、处理错误、向用户报告等都取决于消费代码。

另一种方法是让这个对象“试着找出要做什么”,这通常会导致一些非常糟糕的编码实践。例如……

  • 假设您想要返回一条错误消息而不是抛出异常。如果使用代码不检查该错误消息怎么办?该对象将处于未知和无效状态,并可能悄悄地引入错误。而如果使用代码不检查异常,那么程序显然会失败,需要进行适当的更正。与微妙和未被注意的失败相比,明显和明显的失败很多更容易支持。
  • 假设您想要“向用户显示一条消息”。这将需要将该对象与表示层紧密耦合,这违背了面向对象的原则,并使代码非常僵硬且难以维护。

这个对象做一件事,而且只做那一件事。如果它的调用方式使其不能做那件事,则异常是一种预期且适当的失败条件。

关于c# - 异常处理——这是好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31050121/

相关文章:

c# - 在 WPF 的 HierarchicalDataTemplate 中获取 TreeViewItem 的父级

c# - 将 List<T> 转换为 HashTable

c# - 如何在 C#.NET 中使用温度性能监视器?

c# - 在 C# 中查找包含超过 20,000 个文件的目录中的文件的最快方法

c++ - 允许编译器优化异常抛出吗?

java try and catch..无限循环

c# - 在 C# 中使用套接字发送图像文件(大数据)

c# - Action<T> 还是 Action<in T>?

c# - 是否有关于如何为 .net 应用程序本地化组织非字符串资源的指南?

C# - 围绕抛出自定义异常或处理案例构建逻辑更好吗?