数数据范围反映的都是下层硬件的实际情况,而不是现实世界的需要。例如,当你在代码中把某个值定义为Int32的时候,就意味着用户输入的值应该在-2,147,483,648到2,147,483,647之间。这个数字是依赖于硬件条件的,
计算机使用31位存储数据,1位存储符号(2^31 = 2,147,483,648)。但是,你的应用
程序可能没有查明可接受的范围。
当硬件需求与应用程序的现实需求不一致的时候,你就必须在应用
程序中包含特定的代码来检查潜在的错误条件。你在代码中可能希望接受1到40,000的数字,它超出了Int16的值范围,但是在Int32的值范围中。列表1显示了这类检查的例子。
列表1.检查数据范围错误
System::Void btnDataRange_Click(System::Object * sender, System::EventArgs * e)
{
Int32 TestData; // 保持输入的值
try
{
// 永远需要首先尝试分析数据
TestData = Int32::Parse(txtInput1->Text);
}
catch (System::OverflowException *OE)
{
// 溢出错误处理
MessageBox::Show(S"Type a value between 1 and 40,000.", S"Input Error",
MessageBoxButtons::OK, MessageBoxIcon::Error);
return;
}
catch (System::FormatException *FE)
{
//溢出错误处理
MessageBox::Show(S"Type the number without extra charaters.", S"Input Error",
MessageBoxButtons::OK, MessageBoxIcon::Error);
return;
}
// 测试特定的数据范围
if (TestData < 1 || TestData > 40000)
//溢出错误处理
MessageBox::Show(S"Type a value between 1 and 40,000.", S"Input Error",
MessageBoxButtons::OK, MessageBoxIcon::Error);
}
请注意,这段代码首先使用Parse()方法把输入信息转换成Int32类型。这种简单的转换可以为很多输入方面的问题进行定位。在这个例子中,代码使用System::OverflowException异常检查值是否太大或太小,使用System::FormatException异常检查值的格式是否正确。在代码确保输入信息是一个合理的Int32值之后,接着检查实际的输入范围。
值的数据类型是最容易检查的,因为它们都有特定的范围。值与对象不同,它没有隐藏的元素,使开发者感到惊讶的地方很少。
一般来说,用于验证值数据类型的所有事务是在代码中定义上下边界,接着对值进行检查。
当我们使用对象的时候,数据值验证的问题就出现了。例如,你希望用户把几个字符串中的一个作为输入信息,那么使用列表框来减少用户的输入选择是有帮助的。当用户面对只有数个选项的列表框的时候,他们是不可能输入无效信息(例如脚本)的。
有时候你必须为问题设计独特的方案。例如,你如何确保某个特定的方法接收数量固定的、范围不连续的输入信息?在这种情况下枚举(enumeration)可能会节约时间。列表2显示了在代码中如何把枚举用于自动化的数据范围变化。
类表2:使用枚举检查数据的范围
请注意,DisplayString()的声明需要一个SomeStrings枚举类型的输入信息(参数)。调用者不可能使用其它的任何输入类型,这意味着DisplayString()方法自动地受到了保护。例如,你不可能把某个脚本作为输入信息,因为它不是正确的类型。
验证数据的长度
有些数据类型不太容易进行快速检查。例如,字符串可以包含任意数量的字符,其数量最多只受到.NET框架组件和机器的限制。当然,很少人真的需要这么长的字符串。通常开发者要求字符串有一个最小和最大的长度范围。因此,你不需要验证接收到的是否是字符串,只需要验证它的长度是否正确。否则,其他人可能发送任意长度的字符串,而这样就会导致缓冲区泛滥。列表3显示了通过验证每个参数的数据