【问题标题】:ReThrowing exception and handling it with in a loop ...?重新抛出异常并在循环中处理它......?
【发布时间】:2012-06-14 10:04:03
【问题描述】:

我对重新抛出异常进行了很多实验,得出以下结论:

1)如果我们想提供更多关于异常的详细信息,例如(内部异常),我们可能需要重新抛出

2)我们可能会重新抛出以完全终止程序..

3)如果我们想重新抛出并且不想终止程序,那么我将不得不在循环中处理重新抛出的异常......

我在执行此操作时尝试了以下操作:

 public void input()
        {
            char opt;
            int id;
            int qty;
            int ind = -1;

            do
            {
                Console.WriteLine("Add item to  cart:   ");
                opt = Convert.ToChar(Console.ReadLine());
                if (opt == 'n' || opt == 'N')
                    break;
                else
                {
                    cashier.showProductList();
                    Console.WriteLine("Enter Product ID from above list:    ");
                    id = Convert.ToInt32(Console.ReadLine());
                    foreach (Products item in cashier.ProductList)
                    {
                        if (id == item.ProductID)
                        {
                            BoughtItems.Add(item);
                            ind = Cashier.ProductList.IndexOf(item);                        
                        }
                    }

                    Console.WriteLine("Enter The quantity required:     ");
                    qty = Convert.ToInt32(Console.ReadLine());
                    try
                    {
                        if (qty < 0)
                        {
                            throw new BuisnessException("Qty can not be -ve...", new Exception("enter a valid +ve amount"));
                        }
                        else if (qty < cashier.ProductList[ind].Quantity)
                        {
                            BoughtItems[BoughtItems.Count - 1].Quantity = qty;
                            TotalPrice = TotalPrice + (BoughtItems[BoughtItems.Count - 1].Quantity * BoughtItems[BoughtItems.Count - 1].price);
                        }
                        else if (qty >= cashier.ProductList[ind].Quantity)
                        {
                            throw new QuantityExceedingStockException("Item not in sufficient amount", new Exception("Enter quantity less than" + Cashier.ProductList[ind].Quantity));
                        }
                    }
                    catch (BuisnessException ex)
                    {

                        BoughtItems.RemoveAt(BoughtItems.Count - 1);
                        Console.WriteLine(ex.Message);
                        throw;
                        //throw; //Re throwing terminating the i/p loop if re thrown exception not handled in loop! :/
                    }
                    catch (QuantityExceedingStockException ex)
                    {
                        BoughtItems.RemoveAt(BoughtItems.Count - 1);
                        Console.WriteLine(ex.Message);
                        throw;
                    }
                }

            } while (true);
        }

        public void showCartItems()
        {
            foreach (Products item in _boughtItems)
            {
                Console.WriteLine(item.ProductID + "  " + item.name + "  " + item.price + "  " + item.Quantity);
            }
        }

然后在 main() 中:

            do
        {
            try
            {
                cashier1.Customr.input();
            }
            catch (BuisnessException ex)
            {
                //Console.WriteLine(ex.Message);
                Console.WriteLine(ex.InnerException.Message);
            }
            catch (QuantityExceedingStockException ex)
            {
                Console.WriteLine(ex.InnerException.Message);
            }
            //catch
            //{
            //    Console.WriteLine("Press y below to continue shopping");
            //}
            Console.Write("Continue Shopping ?");
            opt = Convert.ToChar(Console.ReadLine());
            if (opt == 'n')
                break;
            else
                continue;
        } while (true);
        Console.WriteLine("Total Price is:  " + cashier1.Customr.TotalPrice);

如果我不处理循环中重新抛出的异常,我的程序将终止......那么这是否意味着我提出的以上三个结论关于重新抛出异常是正确的??

【问题讨论】:

    标签: exception c#-4.0 exception-handling rethrow


    【解决方案1】:

    你的结论是正确的。我假设在结论 1 中,您的意思是重新抛出异常让您有机会记录错误。

    但是你的方法是非常规的。通常异常不用于处理业务逻辑案例。为什么不像这样修改你的循环(替换你的“try/catch”块)?

    if (qty < 0)
    {
        BoughtItems.RemoveAt(BoughtItems.Count - 1);
        // The code below has been EDITED to show throwing an exception in the same block
        // as the related logic.
        string message = "Qty can not be -ve, enter a valid +ve amount"; // EDITED
        Console.WriteLine(message);
        throw new BusinessException(message); // EDITED
    }
    else if (qty < cashier.ProductList[ind].Quantity)
    {
        BoughtItems[BoughtItems.Count - 1].Quantity = qty;
    TotalPrice = TotalPrice + (BoughtItems[BoughtItems.Count - 1].Quantity * BoughtItems[BoughtItems.Count - 1].price);
    }
    else if (qty >= cashier.ProductList[ind].Quantity)
    {
        BoughtItems.RemoveAt(BoughtItems.Count - 1);
        Console.WriteLine("Item not in sufficient amount, enter quantity less than " + Cashier.ProductList[ind].Quantity);
    }
    

    【讨论】:

    • 非常感谢 .. 但这会导致多个 else ifs 对吗? .. 相反,我们可以使用异常类来处理类似类型的错误,这不会使代码混乱..
    • 上面的代码和你的代码做同样的事情,除了它不会打破循环。如果您仍然想要异常,最好将其与其余相关逻辑放在同一个代码块中。我编辑了上面的代码作为示例。
    猜你喜欢
    • 2011-10-10
    • 2019-05-10
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2012-01-13
    • 2013-03-23
    • 2010-11-06
    相关资源
    最近更新 更多