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;
        }
    }

五、总结

异常处理的优势:

  • 对用户来说,在程序发生错误时,不至于程序崩溃,而可以给出提示信息,提升用户的使用体验
  • 对开发人员来说,可以在短时间内找到程序发生错误的位置,进而提高效率

linuxboy的RSS地址:https://www.linuxboy.net/rssFeed.aspx

本文永久更新链接地址:https://www.linuxboy.net/Linux/2018-12/156036.htm

相关内容

    暂无相关文章