------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
错误可能在程序运行的任何阶段发生,早起系统(如 Unix)采用的典型方案要求在每一次函数出错的时候,都由操作系统设置
一个全局变量,每次调用函数之后,都检查全局变量,判断方法是否成功。
和目前大多数面向对象编程语言一样,C#没有使用这种痛苦的方式来处理错误,在C#中使用异常和异常处理程序,以实现程序主逻辑
与错误处理代码区分开。
在C#中写一个支持异常处理的应用程序,需要做下面两件事:
1、代码要放在一个try{}中,代码运行时,它会尝试执行try块内的所有语句,如果没有任何语句产生一个异常,
这些语句将一个接一个的运行,知道全部完成;一旦出现异常,就会跳出try{},并进入一个catch{}处理程序中执行。
2、在try{}后面紧接着写一个或多个catch{},用catch{}处理任何发生的错误。
每个catch{}都负责捕捉并处理一种特定类型的异常。try{}中任何一句语句造成错误,运行时都会抛出一个异常,然后将检查try{}
后面的catch{},将控制权移交给一个匹配的catch{}。
下面是一个例子,我在一个try{}中尝试讲用户在控制台输入的内容转换成整数值,为了将字符串转换成整数,要求字符串中包含一组
有效的数位,而不能是一组随意的字符。如果字符串包含无效的字符,Convert.ToInt32()会抛出一个异常,由后面的catch{}捕捉异常
并进行处理。catch处理完之后,程序从catch{}后的第一个语句继续执行。
try
{
int number = Convert.ToInt32(Console.ReadLine());
if (number < min || number > max)
{
Console.WriteLine("只能输入{0}-{1}之间的数字,请重新输入!", min, max);
continue;
}
return number;
}
catch
{
Console.WriteLine("只能输入数字,请重新输入!");
}
{
int number = Convert.ToInt32(Console.ReadLine());
if (number < min || number > max)
{
Console.WriteLine("只能输入{0}-{1}之间的数字,请重新输入!", min, max);
continue;
}
return number;
}
catch
{
Console.WriteLine("只能输入数字,请重新输入!");
}
……
如果try{}是某个函数的一部分,try{}中抛出的异常后面没有合适的catch{}捕捉到,那么这个函数将立即退出,并返回它的调用方法,
如果它的调用方法使用了一个try块,运行时会尝试定位try{}之后的一个匹配的catch{}并执行它;如果没有使用try{}或没有定位到
合适的catch{},那个调用函数也将退出,返回它的上一级调用函数,以此类推。
checked语句
checked语句是以checked关键字开头的一个代码块。checked语句中的任何整数运算溢出,都会抛出一个OverFlowException异常:
int num = int.MaxValue;
checked
{
int a=num++;
Console.WriteLine("执行不到这里!!");
}
还可以使用unchecked来创建一个强制不检查溢出的语句块。一个unchecked块中所有整数运算都不会检查,永不抛出异常!!
int num = int.MaxValue;
unchecked
{
int b=num++;
Console.WriteLine("能执行到这里!!");
}
checked表达式:
使用 checked和unchecked关键字还可以对单独的整数表达式进行溢出检查。
int a = checked(int.MaxValue + 1);
int b= unchecked(int.MaxValue + 1);
抛出异常(throw)
switch(month)
{
case1:
return "一月 " ;
case2:
return "二月 " ;
……
case12:
return "十二月 " ;
default:
throw new ArgumentOutOfRangeException("不存在的月份");
}
throw抛出一个异常对象。后面可以跟catch{}捕捉异常,并对异常进行处理!
finally{}块
当一个异常抛出是会改变程序的执行流程。这意味着不能保证当一个语句结束后,它之后的语句肯定会执行。
有时候一个特定的语句不运行不会造成问题,但大多数时候,它都会造成大问题,加入一个语句的作用是释放它之前
一个语句获得的资源,不如不执行该语句会造成资源得不到释放。
为了确保一个语句总是运行,可以把语句放入finally{}中;finally{}要么紧挨在try{}后,要么紧接在try{}之后最后一个
catch{}之后,只要程序进入与一个finally{}关联的try{},finally{}就一定会被执行;即使抛出了一个异常,异常被捕捉到
运行catch{}之后将执行finally{};如果异常没有被捕捉,那么finally{}也将运行!!