如何实现AddProduct方法抛异常并在调用方捕获?现有写法是否正确?
你的写法完全不正确,存在这些核心问题:
- 核心需求未实现:你希望AddProduct方法抛出异常,但当前AddProduct里仅在产品不存在时执行添加,产品存在时啥也不做,完全没有抛出异常的逻辑,和你的需求完全背离。
- 异常捕获逻辑完全错位:
- 你调用
categoryExist.AddProduct(product, categoryExist);的代码不在try块内,就算后续给AddProduct加上抛异常的逻辑,这里也捕获不到。 - try块里反而直接操作
ProductDictionary.Add,等于绕开了AddProduct方法自己做重复操作,完全不符合“调用AddProduct时捕获异常”的要求。
- 你调用
- 参数与变量命名混乱:
- 调用AddProduct时传递的参数
categoryExist,虽然类型匹配,但变量名和方法参数名混淆;还有productExistInCategoryInCategory这种冗余的变量名,可读性极差,后期维护困难。 - AddProduct里的
var addPToCat = new Program();是完全无用的冗余代码,既没使用也没起作用。
- 调用AddProduct时传递的参数
- catch块写法不规范:
- 使用无参
catch会捕获所有异常(比如空引用、索引越界等非预期异常),这是不良实践,应该只捕获你预期的ArgumentException类型。 - 捕获后先输出提示又重新创建新的ArgumentException抛出,会丢失原异常的堆栈信息,不利于排查问题;如果需要重新抛出,应该用
throw;保留原堆栈,或者将原异常作为内部异常传递。 - 在catch块里加
Thread.Sleep(2000)非常奇怪,异常处理逻辑里不该阻塞线程,除非有特殊业务要求。
- 使用无参
- 逻辑重复冗余:AddProduct里已经检查过产品是否存在,AddProductToCategory里又重复做了
productExistInCategoryInCategory的判断,完全没必要。
修正后的示例代码
改造AddProduct方法(实现抛出异常)
public void AddProduct(Product product1, Category category) { bool productExistInCategory = ProductDictionary.Any(x => x.Key == product1.ArticleNumber); if (productExistInCategory) { // 产品已存在时抛出指定异常,附带明确信息 throw new ArgumentException($"产品 {product1.ArticleNumber} 已存在于该分类中", nameof(product1)); } ProductDictionary.Add(product1.ArticleNumber, category.Name); }
改造AddProductToCategory方法(正确捕获异常)
public void AddProductToCategory() { if (productExist && categoryExist != null) { try { // 将AddProduct调用放在try块内,才能捕获它抛出的异常 categoryExist.AddProduct(product, categoryExist); } catch (ArgumentException ex) { Console.WriteLine(ex.Message); // 保留原异常堆栈,重新抛出(如果需要向上传递异常) throw; // 若需自定义错误信息并保留原异常,可改为: // throw new InvalidOperationException("添加产品到分类失败", ex); } } }
内容的提问来源于stack exchange,提问作者user17169431
相关产品推荐
相关产品推荐

