黑马程序员——C#中的异常捕获机制try-catch

时间:2023-02-19 15:45:11
---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

  因为学过C语言的关系,再看C#基础这块,觉得和C语言大同小异,数据类型、运算符、表达式基本上是一致的,还有三种程序结构:顺序结构、选择结构、循环结构以及这三种结构的语句、语法可以说是完全一样的。不过因为已经有三年多时间没有接触C语言了,所以我还是从头把C#基础给看了一遍,不然肯定会有很多东西丢掉的。

  看到异常捕获机制try-catch这块的时候,我感觉到和C语言终于有了明显差异的地方了,没记错的话,当初学C语言时,没有这个异常捕获机制的,也就是好像从没有考虑过用户输入有误的情况下如何处理。当时写C语言程序时,都是用scanf()、printf()函数来达到输入、输出功能,它们的形式是scanf(格式控制,地址表列)、printf(格式控制,地址表列),例:

        #include<stdio>
void main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d",a,b,c);
}

  运行时会等待让用户输入三个变量的值,然后再输出这三个变量的值。

  可以看到scanf()、printf()函数和C#中的Console.ReadLine()、Console.WriteLine()方法很类似。不过scanf()函数中直接指明输入的格式和输入内容赋给哪些变量。至于用户若不按照指明的输入格式来输入的话会出如何,当初学的时候并没有讲到,书中也没有提过怎么处理这个问题,只是说会出现错误,因此一直到现在也没有考虑过这个情况,现在看到C#中说到异常捕获机制才想起会有这种情况发生,而且还是很容易发生的。因此异常捕获机制应该是必须有的啊,可能当初学的是皮毛,没有涉及到这个内容。

  现在就来看一下C#中的异常捕获机制是如何运作的吧:

  try-catch即为异常捕获机制的语句,它的语法如下:

    try
    {
    //有可能出现错误的代码;
    }
    catch
    {
    //出错后的处理;
    }

  这样就可以将这个语句用在用户输入有误导致异常的情况下了。

  在C#中用户输入的内容都是作为字符串来处理的,所以要想得到一个数字,就必须先进行类型转换。常用的方法是:Convert.ToInt32(Console.ReadLine());就是把用户输入的内容转换为int类型的数据,通常再用一个变量接收转换后的值。可是当用户输入出现不能转换的内容时,如用户输入了不是数字的字符,编译时就会出错!这时我们就可以用try-catch这个异常捕获机制来解决这个问题了。现通过学习中的练习题来看一下try-catch的使用:

  让用户输入班级的人数以及每个人的成绩,求平均成绩和总成绩。

        static void Main(string[] args)
{
int i = 0;
int score = 0;
int sum = 0;
int avg;
Console.WriteLine("请输入班级人数");
int n = Convert.ToInt32(Console.ReadLine());//定义变量n接收用户输入的班级人数
while (i < n)//循环输入班级学员的成绩
{
Console.WriteLine("输入第{0}个学员成绩", i + 1);
score = Convert.ToInt32(Console.ReadLine());
sum += score;//计算总成绩
i++;
}
avg = sum / n;//计算平均成绩
Console.WriteLine("班级学员的平均成绩为:{0},总成绩为:{1}", avg, sum);

Console.ReadKey();
}

  上面的程序是没有考虑用户输入有误的情况。当用户输入有误时,编译就会出错!如下图:

黑马程序员——C#中的异常捕获机制try-catch

  要避免出现这样的情况就要用到try-catch了,本题中有两处涉及到用户输入数字的地方,所以改进后的代码如下:

        static void Main(string[] args)
{
int i = 0,n = 0,score = 0,sum = 0;
int avg;
bool flag = true;//设置一个标识符
Console.WriteLine("请输入班级人数");
while (flag)
{
try
{
n = Convert.ToInt32(Console.ReadLine());//定义变量n接收用户输入的班级人数
flag = false;//输入正确后改变标识符的值,跳出循环
}
catch
{
Console.WriteLine("你输入的不是数字,请重新输入!");//输入不是数字,则循环让用户重新输入
}
}
while (i < n)//循环输入班级学员的成绩
{
try
{
Console.WriteLine("输入第{0}个学员成绩", i + 1);
score = Convert.ToInt32(Console.ReadLine());
sum += score;//计算总成绩
i++;
}
catch
{
Console.WriteLine("你输入的不是数字,请重新输入!");//输入不是数字,则循环让用户重新输入

}
}

avg = sum / n;//计算平均成绩
Console.WriteLine("班级学员的平均成绩为:{0},总成绩为:{1}", avg, sum);

Console.ReadKey();
}

  这样改动后,通过在循环中使用try-catch语句,可以达到当用户输入有误时就会直接在程序中提醒用户,并要求用户重新输入,直到输入正确的功能。

  可见用try-catch这个异常捕获机制来应对用户输入有误的情况还是很有用处的,当然这只是自己对try-catch的一点见解,不够透彻、不够全面,后面可能会接触到try-catch更全面、更深入的用途,到时肯定会有另一番领悟的。

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流!----------------------详细请查看:http://net.itheima.com/