用户自定义异常

时间:2021-04-08 22:20:17
 

用户自定义异常

一般情况下,我们使用系统内部提供的异常就足够了,但是有时为了特殊的目的,必须使用用户自定义异常,本文讨论的异常处理机制,以及如何创建、抛出和捕获用户自定义异常。

1.     异常处理机制

无论我们使用的是系统自动义异常,还是用户自定义异常,它们都具有相同的异常处理机制,都包括定义异常类、抛出异常对象和捕获并处理异常三部分,只不过是前两个过程已经在.NET框架中定义好了。

a)     定义异常类

异常类本身和一般的类的定义没有任何区别,但是由于使用Throw关键字和catch关键字所抛出和捕获的异常对象必须是Exception类或者Exception类子类的子类对象,因此所有用户自定义的异常类必须由Exception类或者Exception类的子类派生。

b)    抛出异常对象

由于异常属于意外事件,并不是总是发生,必须有一个条件判断语句if(满足抛出异常条件);然后再抛出异常throw new Excrption

如下例:

Ify == 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!");

        }