我有一个简单的问题。我不确定最好的方法是什么。 我应该为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);
}
答案 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不是有效月份。 :)