类属性设置器没有抛出预期的异常

  • 本文关键字:异常 属性 设置 c# exception
  • 更新时间 :
  • 英文 :


我有一个类叫做" person ";它接受名字,年龄和体重属性。我试图确保,当一个人对象实例化,名称属性是至少5个字符,并包含一个空格。如果不是,我想抛出一个新的异常。下面是名称prop的setter:

public string Name
{
get
{
return this.name;
}
set
{
if (value.Length < 5 || value.Contains(" ") == false)
{

throw new ArgumentException("Invalid");

}
else
{
this.name = value;
}
}
}

我创建了一对无效数据的person对象,没有抛出异常。我的计划是在构造函数中使用try catch块来处理异常。我是不是走错路了?

这个程序中没有用户输入,它只是一个赋值。我们应该用无效数据实例化一些person对象来测试异常处理代码。下面是一个应该抛出异常的对象示例:

person p1 = new person("hi", 26, 165);

是类的构造函数:

public person(string Name, string Age, double Weight)
{

this.name = Name;               

this.weight = Weight;


try
{
this.age = int.Parse(Age); 

}
catch (FormatException)
{
WriteLine("Age must be an integer number. Age set to 0 by default.");
this.age = 0;
}              

}

这是基于前面的赋值,我们必须将age作为字符串值并尝试解析它。

您没有在构造函数中调用Namesetter,因此没有调用属性setter。使用

this.Name = Name;

,以调用属性setter。

还有一些细节,但我也会使用:

if (value.Length < 5 || !value.Contains(" "))

而不是== false,并给出更好的错误消息:

throw new ArgumentException("Name must be at least 5 characters and must contain a space", "Name");

你的构造函数应该是这样的

public person(string name, string age, double weight)
{

this.Name= name;               

this.Age= age;
this.Weight = weight;                
}

然后调用setter并在需要时抛出异常

你的名字属性不会抛出异常,因为你没有调用setter。使用这个

Name=name;

并且通常使用_作为私有成员,因此在name getter/setter中使用_name而不是name。

恕我直言,使用异常来描述代码流是个坏主意。所以不需要将Name定义为

public string Name {get; set; }

并将验证移动到构造函数

public person(string name, string age, double weight)
{
Weigt=weght;
if (name.Length < 5 || !value.Contains(" ") )
Consodle. WriteLine ($"Name {name} is not valid. Must be at least 5 characters and contain a space");              
else  Name = name

if (Double.TryParse(age, out number)) Age=age;
else 
Console.WriteLine($"Unable to parse age {age}.");    

}

相关内容

最新更新