用户自定义异常
一般情况下,我们使用系统内部提供的异常就足够了,但是有时为了特殊的目的,必须使用用户自定义异常,本文讨论的异常处理机制,以及如何创建、抛出和捕获用户自定义异常。
1. 异常处理机制
无论我们使用的是系统自动义异常,还是用户自定义异常,它们都具有相同的异常处理机制,都包括定义异常类、抛出异常对象和捕获并处理异常三部分,只不过是前两个过程已经在.NET框架中定义好了。
a) 定义异常类
异常类本身和一般的类的定义没有任何区别,但是由于使用Throw关键字和catch关键字所抛出和捕获的异常对象必须是Exception类或者Exception类子类的子类对象,因此所有用户自定义的异常类必须由Exception类或者Exception类的子类派生。
b) 抛出异常对象
由于异常属于意外事件,并不是总是发生,必须有一个条件判断语句if(满足抛出异常条件);然后再抛出异常throw new Excrption
如下例:
If(y == 0)//如果被除数为零
{
Throw new DivideByZeroException();//抛出DivideByZeroException异常类对象;
}
c) 捕获并处理异常
catch关键字用于捕获在try程序块中所引发的异常,根据该关键字所携带的参数列表的不同具有多种重载方式,但是所有的catch重载块最多只有一个被执行。
如下例:
catch(DivideByZeroException dz)
{
Console.WriteLine(dz.ToStirng());
}
用户自定义异常类
所有的用户自定义异常类都必须由Exception类或者Exception类的子类派生,所以必须显示指明异常类的基类
public class MyException:Exception// MyException这个类是Exception 的子类;但是如果是public class MyException: DivideByZeroException,则MyException是DivideByZeroException类的子类。
不能重写父类的无参数的构造方法
给MyException添加字段
string _Mes;用于保存自定义的异常提示信息
给MyException添加无参数的构造方法
public MyException()
{
Console.WriteLine("发生了异常");
}
给MyException添加一个参数的构造方法
public MyException(string msg)
{
_Mes = msg;
//Console.WriteLine("发生了异常");
}
给MyException添加两个个参数的构造方法,并且指明使用父类的两个参数的构造方法。
public MyException(string msg,MyException e):base(msg,e)
{
_Mes = msg;
Console.WriteLine(e.Message);
//Console.WriteLine("发生了异常");
}
重写父类的Message属性
public override string Message
{
get
{
return _Mes;
}
}
添加自己的异常处理类的一个新方法。
public void Mess()
{
Console.WriteLine("笨蛋,除数为零了!");
}
总之,定义异常类和定义一个普通类的方法是一致的。
抛出用户自定义异常
public class Test//定义一个,在div方法中抛出一个异常对象
{
public static float div(int x,int y)//在C#语言中不能够使用类似Java的Throws关键字
{
if(y == 0)//判断抛出异常的条件
{
throw new MyException("笨蛋,除数为零了!.....................");//抛出一个带有自己定义信息的异常对象
}
else
{
return (float)x/(float)y;
}
}
}
捕获并处理异常对象
Try//所有的可能引发异常的语句都必须放在try块中
{
Test.div(b,a);//方式异常的语句之后的所有代码将要放弃执行;
}
catch( MyException me )
{
Console.WriteLine(me.Message);
throw new MyException(me.Message,me);
}
catch(DivideByZeroException dz)
{
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());//捕获异常对象后,可以调用对象的任何方法。
}
Finally//一般情况下Finally代码块将要一定被执行
{
Console.WriteLine("finish!");
}