C#如何让try/catch捕获List超量添加事件,抛出TableFull满员异常
问题原因
你对List<T>构造函数的参数存在误解:传入的int值是初始容量,仅用于预先分配内存空间降低后续扩容的性能损耗,并非列表的最大元素上限。当添加的元素数量超过初始容量时,List<T>会自动申请更大的内存完成扩容,全程不会抛出异常,这是你当前代码无法触发预期逻辑的核心原因。
修改方案
你需要自己封装客人添加的校验逻辑,禁止外部直接操作内部的客人列表,具体修改规则如下:
- 先自定义
TableFull异常类,继承自Exception,符合C#自定义异常的规范 - 修改
Table类的设计:将ListOfGuests改为私有成员,对外暴露AddGuest方法,在方法内判断当前客人数量是否等于椅子上限,超出则抛出TableFull异常 - 主函数中调用封装好的
AddGuest方法添加客人即可,同时已修正原代码中NubmerOfChairs的拼写错误
修改后完整代码
namespace test { class Program { // 自定义桌满异常类 public class TableFull : Exception { public TableFull(string message) : base(message) { } } class Table { public int NumberOfChairs { get; set; } // 客人列表改为私有,避免外部直接操作绕过校验 private List<Gost> ListOfGuests { get; set; } public Table(int ChairNum) { this.NumberOfChairs = ChairNum; this.ListOfGuests = new List<Gost>(ChairNum); } // 封装添加客人方法,加入容量校验 public void AddGuest(Gost guest) { if (ListOfGuests.Count >= NumberOfChairs) { throw new TableFull("No chairs left"); } ListOfGuests.Add(guest); } } class Gost { public string name; public string secname; public string gender; public string status; public string bd; public string gmail; public Gost(string name, string secname, string gender, string status, string bd, string gmail) { this.name = name; this.secname = secname; this.gender = gender; this.status = status; this.bd = bd; this.gmail = gmail; } } static void Main(string[] args) { Table polnaMiza = new Table(2); Gost novGost = new Gost("Jack1", "black1", "M", "student", "22.2.1966", "testxxx@gmail.com"); Gost novGost2 = new Gost("Jack2", "black2", "M", "student", "22.2.1966", "testxxx@gmail.com"); Gost novGost3 = new Gost("Jack3", "black3", "M", "student", "22.2.1966", "testxxx@gmail.com"); polnaMiza.AddGuest(novGost); polnaMiza.AddGuest(novGost2); // 执行到下一行就会触发TableFull异常 polnaMiza.AddGuest(novGost3); } } }
内容的提问来源于stack exchange,提问作者Jure Kozole
相关产品推荐
相关产品推荐

