抛出DateTime的范围异常

时间:2017-03-14 17:16:43

标签: c# datetime exception exception-handling

我有一个简单的问题。我不确定最好的方法是什么。 我应该为DateTime抛出超出范围的异常吗?因为我想尽可能地使我的代码成为白痴。

底部是我的代码。这是抛出异常的好方法吗?当我没有抛出超出范围的异常时,会发生争论。我应该抛出一个参数异常吗?这些正确的参数是否属于我的例外。解决这个问题的最佳方法是什么?这是一般抛出异常的好方法吗?

由于

private DateTime date;
public SimpleDate(int day, int month, int year)
{
    if (day > 31 || day < 0)
    {
        throw new ArgumentOutOfRangeException("day");
    }
    if (month > 12 || month < 0)
    {
        throw new ArgumentOutOfRangeException("month");
    }
    if (year > 2100 || year < 1900)
    {
        throw new ArgumentOutOfRangeException("year");
    }
    date = new DateTime(year, month, day);
}

2 个答案:

答案 0 :(得分:1)

从概念的角度来看,这是一个很好的方法;您的对象最适合知道什么是有效输入,而不是对象的调用者。但是,显然你的逻辑并不完整;有一些重要的“极端案例”,如2月31日。这也是一个重复的工作。

DateTime constructor accepting Year, Month and Day将验证这些数字的组合是否产生有效日期,如果不是,则会抛出自己的ArgumentOutOfRange异常。验证更完整;它不仅会验证每个月的正确天数,还会进行闰年计算,以确定2月29日是否对指定年份有效。最重要的是,它已经存在;正如Equalsk在评论中所说,为什么要重新发明轮子?

因此,绝大多数验证应该来自于只是尝试从输入的数字构造一个新的Date,并让DateTime构造函数根据需要抛出。您可以根据需要添加自己的更严格的验证;例如,将输入的年份限制在1900到2100之间(System.DateTime能够处理“共同时代”中的任何四位数年份,0001到9999)。

答案 1 :(得分:0)

我没有看到抛出异常有什么问题,验证正在输入的数据通常是个好主意。

我注意到的一件事,不应该

if (month > 12 || month < 0)if (month > 12 || month <= 0)。 0不是有效月份。 :)