前言
其实在学习c#视频的时候我们也是都实践过用try-catch实现对于除0和数值不符合规范等的情况异常捕捉,但是对于异常处理机制的系统性的了解我们还不是很深入,将在以后的学习中继续实践和利用。
内容
一:异常处理的结构体
try
{
//获取并使用资源,可能出现异常
}
catch(Exception e)
{
//捕获并处理异常,当出现多个异常且异常类之间有继承关系
}
finally
{
//无论什么情况(即使在catch块中return)下,都会执行该块的代码(如:关闭文件)
//另外需要说明的是,在finally块中使用任何break、continue、return退出都是非法的。
}
详解:
try 用于检查发生的异常,并帮助发送任何可能的异常。
catch 以控制权更大的方式处理错误,可以有多个catch子句。
finally 无论是否引发了异常,finally的代码块都将被执行。
throw 用于引发异常,可引发预定义异常和自定义异常。
二:对于异常的情况处理:
1.不处理
2.在捕捉处进行
3.跳到另一个地方处理(throw):如果没有在捕捉在异常发生的地方进行处理,那么就会存在异常传播。
三:引出异常抛出的情况:
1.尝试被0除
2.数组索引超出了边界
3.请求不能正常完成I/O操作
4.尝试使用空引用。
5.尝试执行违背某种安全措施的操作。
五:用一个简单的例子来实现异常处理
1.普通实现被“0”除的异常:
namespace 异常
{
class divisor //定义了一个除法类
{
static void Main(string[] args)
{
//定义了一系列相关的数
int dividend = 10;
int divisor1 = 0;
int divisor2 = 5;
int dividevalue;
try
{
dividevalue = dividend / divisor1; //(1)
dividevalue=dividend/divisor2; //(2)
System.Console.WriteLine("dividevalue={0}", dividevalue);//(3)这一行将不会被执行。
}
catch (Exception e)
{
System.Console.WriteLine("传递过来的异常值为:{0}", e.Message);
}
finally
{
System.Console.WriteLine("无论是否发生异常,我都会显示。");
}
Console.ReadKey();
}
}
}
2.自定义的除数异常处理:
namespace 自定义异常
{
public class selfexp : System.Exception { } //声明异常
public class divisor //定义了一个乘积类
{
public static int div(int one, int two) //静态除法函数
{
if (one > 100 || two > 100)
throw new selfexp(); //引发自定义的异常
return (one /two);
}
public static void Main(string[] args)
{
int div_value;
try //执行方法体,如果有错,将抛出异常。
{
div_value = div(3, 1);
System.Console.WriteLine("99与56积为:{0}", div_value);
div_value = div(101, 4);
System.Console.WriteLine("出现异常,这行是不会被执行的。");
}
catch (selfexp)//捕获自定义的异常
{
System.Console.WriteLine("您输入的数字不合符规范啊,此为自定义的异常!");
}
catch (System.Exception e)
{
System.Console.WriteLine("非自定义异常。其值为:{0}", e);
}
Console.ReadKey();
}
}
}
结果就会显示出来:
其实通过这两例子的我们就可以发现,exception也是一个异常类,我们也是通过可以继承它来达到捕捉我们想要的异常,这也是面向对象的好处,具有多态性。
总结:
总之,对于异常处理在我们以后的代码生涯中会经常的使用到,它是一个好东西,可以使我们界面更加的友好,所以在学到了c#异常处理的时候我们应该去好好的思考,真正的去实践它!