You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现AddProduct方法抛异常并在调用方捕获?现有写法是否正确?

你的写法完全不正确,存在这些核心问题:
  • 核心需求未实现:你希望AddProduct方法抛出异常,但当前AddProduct里仅在产品不存在时执行添加,产品存在时啥也不做,完全没有抛出异常的逻辑,和你的需求完全背离。
  • 异常捕获逻辑完全错位:
    • 你调用categoryExist.AddProduct(product, categoryExist);的代码不在try块内,就算后续给AddProduct加上抛异常的逻辑,这里也捕获不到。
    • try块里反而直接操作ProductDictionary.Add,等于绕开了AddProduct方法自己做重复操作,完全不符合“调用AddProduct时捕获异常”的要求。
  • 参数与变量命名混乱:
    • 调用AddProduct时传递的参数categoryExist,虽然类型匹配,但变量名和方法参数名混淆;还有productExistInCategoryInCategory这种冗余的变量名,可读性极差,后期维护困难。
    • AddProduct里的var addPToCat = new Program();是完全无用的冗余代码,既没使用也没起作用。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33