2011-11-27 46 views
1

的问题是:在C#中的尝试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();  
     } 
    } 
} 
+1

*“如果预订机票总数超过可用机票,应用程序应该引发异常”* - 不,绝对不应该。在出乎意料的情况下引发异常,而不是因为某些数字遇到了自然边界。 – Tomalak

+2

@Tomalak你是对的,但这似乎更像是功课... – Yahia

+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(); 

     } 
    } 
} 

throw秒的Exception ...

+0

谢谢。我忘记了抛出一个对象的用法,这意味着! :(。 – tandem

2

的问题告诉你,如果预订数量超过可数抛出异常。

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

上图:

pay = 100 * numberOfTickets; 

拉升:

if(numberOfTickets>numberOfAvailableTickets) 
{ 

里面的if地说:

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

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

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

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

2

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

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

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

虽然这是一个'快速修复',可以这么说,只需添加一个throw new Exception();,您想要抛出异常的地方就可以工作。

但是,理想情况下,我会建议为此创建一个自定义Exception类。但上一行应该无论如何:)

0

我建议你删除尝试&捕获和简单使用MessageBox。

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