在C#中尝试catch块的疑问

时间:2011-11-27 11:20:08

标签: c# try-catch

问题是:

应用程序应询问用户要预订的门票总数。如果预订门票的总数超过可用门票,则预订门票,申请应提出例外。当我这样做时,我不知道为什么它没有显示错误我想出了这个解决方案:

using System;    
namespace Ticket
{
    class blah
    {
        public void abc()
        {    
            int numberOfTickets;
            int numberOfAvailableTickets=10;
            int cost = 100;
            int pay;
            Console.WriteLine("how many tickets do you need");
            numberOfTickets = Convert.ToInt32(Console.ReadLine());

            try
            {
                if (numberOfTickets < numberOfAvailableTickets)
                {
                    pay = 100 * numberOfTickets;
                    Console.WriteLine("Pay please");
                    Console.WriteLine(pay);
                }                
            }                
            if( numberOfTickets>numberOfAvailableTickets)
            {                 
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
            }
        }
    }

}

 class Theater
 {
        static void Main(string[] args)
        {
            blah hi = new blah();
            hi.abc();
            Console.ReadLine();    
        }
  }
}

5 个答案:

答案 0 :(得分:3)

我甚至不确定你展示的代码是否会编译...试试这个

using System;

namespace Ticket
{
    class blah
    {
        public void abc()
        {

            int numberOfTickets;
            int numberOfAvailableTickets=10;
            int cost = 100;
            int pay;
            Console.WriteLine("how many tickets do you need");
            numberOfTickets = Convert.ToInt32(Console.ReadLine());

            try
            {

            if( numberOfTickets>numberOfAvailableTickets)
                throw new Exception ("Not enough Tickets available!");


                    pay = 100 * numberOfTickets;
                    Console.WriteLine("Pay please");
                    Console.WriteLine(pay);

            }
            catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }
        }
    }

}
    class Theater
    {
        static void Main(string[] args)
        {
            blah hi = new blah();
            hi.abc();
            Console.ReadLine();

        }
    }
}

如果输入的号码超过可用票证,则throwException ...

答案 1 :(得分:2)

问题是如果预订的号码超过可用号码,则告诉您抛出异常。

所以你在abc中不需要任何trycatch(我真的希望这些名字不在你的真实代码中)。您也可以删除if (numberOfTickets < numberOfAvailableTickets)(但保留代码。

以上:

pay = 100 * numberOfTickets;

向上移动:

if( numberOfTickets>numberOfAvailableTickets)
{

if put:

throw new ArgumentException("numberOfTickets is greater than numberOfAvailableTickets");

如果需要,您可以将ArgumentException更改为custom exception

另请注意,如果您使用的是catch,则必须在尝试后立即使用catch。您之间不能有if。请参阅documentation

Main中,您可以捕获该异常,也可以让它终止该应用程序(不清楚您提供的内容)。

答案 2 :(得分:2)

您必须使用throw来引发异常:

if( numberOfTickets>numberOfAvailableTickets)
     throw new Exception();

答案 3 :(得分:0)

问题是您没有显式抛出异常。除非你这样做,否则编译器会发现代码没有任何问题,因为默认情况下它只会抛出实际影响程序运行状态的异常。

虽然这是一个“快速修复”,但是,只需添加一个throw new Exception();,您希望抛出异常就可以了。

但是,理想情况下,我建议为此目的创建自定义Exception类。但前一行应该可行:)

答案 4 :(得分:0)

我建议你删除试用版&amp;捕获并简单使用MessageBox。

if (numberOfAvaiableTickets < numberOfTickets)
{
    MessageBox.Show("Number of tickets exceeded", "ErrorWindow");
}
else
{
     pay = 100 * numberOfTickets;
     Console.WriteLine("Pay please");
     Console.WriteLine(pay);
}