C#基础之异常处理及自定义异常

一、什么是C#中的异常?

异常是程序运行中发生的错误,异常处理是程序的一部分。C#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说System.Exception类是所有预定义的系统异常的基类。错误的出现并不总是编写应用的程序员的原因,有的时候应用程序也会因为终端用户的操作不当而发生错误。无论如何,在编写程序前都应该预测应用程序和代码中出现的错误。
二、常见的异常都有哪些?

① ArrayTypeMismatchException

向数组中存数据时,存入的数据与数组定义的数据类型不同的时候便会出现该异常

② DivideByZeroException

用零除整数时引发该异常

③ IndexOutOfRangeException

数组越界异常

④ NullReferenceException

对象引用为空异常

⑤ OverflowException

算数运算溢出

⑥ InvalidCastException

运行时强制转换无效异常
三、异常处理

使用如下代码结构来捕获和处理异常:

try{
    //try块中包含容易产生异常的代码
}
catch{
    //异常处理代码
}
finally{
    //用于消除try块中分配的任何资源
    //以及即使发生异常也需要继续运行的代码
}

其中finally代码块是try-catch结构执行完成后,无论是否发生异常,finally代码块都会执行。即便是写代码时在try-catch结构里return了,仍旧是会执行了finally代码块之后再去return。

接下来看一个简单的异常捕获及处理的例子:

public class MyException
{
     public static void Main()
     {
         try
         {
             A();
             B();
             C(null);
         }
         //捕获A,B,C方法抛出的异常
         catch (Exception ex)
         {
             //打印出异常信息
             Console.WriteLine(ex);
             Console.ReadKey();
          }
     }

     static void A()
     {
         // throw语法.
         try
         {
             //引发零除异常
             int value = 1 / int.Parse("0");
         }
         catch
         {
             //捕获到异常不做处理继续抛出异常
             throw;
         }
     }

     static void B()
     {
         // 过滤异常类型.
         try
         {
             int[] array = new int[]{ 1, 2, 3 };
             //引发数组越界异常
             array[6] = 4;
         }
         //捕获到数组越界异常
         catch (IndexOutOfRangeException ex)
         {
             //抛出数组越界异常
             throw ex;
         }
     }

     static void C(string value)
     {
         // 创建新的异常.
         if (value == null)
         {
             //抛出新的异常
             throw new ArgumentNullException("value");
         }
     }
}

值得一提的是推荐使用throw来抛出异常。因为throw ex会将到现在为止的所有信息清空,认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正发生异常的代码位置。
四、自定义异常

自定义异常应该具有以下三个特征:

① 继承自System.ApplicationException类,并且使用Exception作为自定义异常类名的结尾

② 包含三个构造函数:一个无参构造函数;一个字符串参数的构造函数;一个字符串参数,一个内部异常作为参数的构造函数

③ 抛出自定义异常:throw new MyException(); 捕获自定义异常:Catch(MyException){ }

举个例子:
 

public class MyException : ApplicationException
    {
        private string error;
        private Exception innerException;
        //无参数构造函数
        public MyException()
        {

        }
        //带一个字符串参数的构造函数
        public MyException(string msg)
        {
            error = msg;
        }
        //带有一个字符串参数和一个内部异常信息参数的构造函数
        public MyException(string msg, Exception exception)
        {
            innerException = exception;
            error = msg;
        }
        public string GetError()
        {
            return error;
        }
    }

你可能感兴趣的:(c#,开发语言)