.NET----错误和异常处理机制

前言

  错误的出现并不老是编写程序的人的缘由,有时应用程序会由于应用程序的最终用户引起的动做或运行代码的环境发生错误。不管如何,咱们都应预测应用程序中出现的错误,并相应的进行编码。html

  .Net改进了处理错误的方式。C#处理错误的机制能够为每种错误提供自定义处理方式,并把识别错误的代码与处理错误的代码分别开来。编程

异常类

  在C#中当出现某个特殊的异常错误条件时,就会建立抛出一个异常对象,这个对象包含有助于跟踪问题的信息。.Net提供了许多预约义的异常类,咱们下面看看一些常见特别的异常类吧(异常类太多了,这里就介绍几个常见的)。c#

  对于.Net类,通常的异常类System.Exception派生自System.Object,一般不在代码中抛出System.Exception泛型对象,由于他们没法肯定错误状况的本质。数组

  在该层次中有两个重要的类,他们派生自System.Exception类:性能

    •  SystemException------该类用于一般由.NET容许库抛出的异常,或者由几乎全部的应用程序抛出的异常。例如,若是.NET运行库检测到栈已满,他就会抛出StackOverflowException异常。另外一方面,若是检测到调用方法时参数不对,就能够在本身的代码中选择抛出ArgumentException异常或其子类。SystemException异常的子类包括表示致命错误和非致命错误的异常。
    •  ApplicationException----在.NET Framework最初的设计中,是打算把这个类做为自定义应用程序异常类的基类的。不过,CLR抛出的一些异常类也派生自这个类。应用程序抛出的异常则派生自SystemException。所以从ApplicationException派生自自定义异常类型没有任何好处,取而代之的是,能够直接从Exception基类派生自定义异常类。

  其余可能会用到的异常类包括:学习

    •  StackOverflowException-------若是分配给栈的内存区域已满,就会抛出这个异常。若是一个方法连续地递归调用本身,就可能发生栈溢出。这通常是一个致命错误,由于它禁止应用程序执行除了中断之外的其余任务。在这种状况下,甚至也不可能执行到finally块。一般用户本身不能处理像这样的错误,而应退出应用程序。
    •  EndOfStreamException-------这个异常一般是由于读到文件末尾而抛出的,流表示数据源之间的数据流。
    •  OverflowException-----若是要在checked上下文中把包含-40的int类型数据强制转换为uint数据,就会抛出这个异常
    •  MemberAccessException----------该类用于处理访问类的成员失败时所引起的异常。失败的缘由可能的缘由是没有足够的访问权限,也多是要访问的成员根本不存在(类与类之间调用时经常使用)
    •  IndexOutOfException-------该类用于处理下标超出了数组长度所引起的异常

使用try...catch...finally捕获异常

  • try 块包含的代码组成了程序的正常操做部分,但这部分程序可能会遇到某些严重的错误。
  • catch块包含的代码处理各类错误,这些错误是执行try块中的代码时遇到的问题。这个快能够用来记录错误。
  • finally快包含的代码清理资源或执行一般要在try块或者catch块末尾执行的其余操做。不管是否抛出异常,都会执行finally块。finally块中防止return语句,编译器会标记一个错误。另外此块能够若是没有须要关闭或者处理的其余操做能够省略此块。

 

  异常处理具备性能含义,在常见的状况下,不该该使用异常处理错误。应尽可能编写好避免错误出现的代码。ui

  在异常捕获中,咱们能够实现多个catch块来针对不一样的错误作出对应的错误处理。下面咱们看一个例子:编码

class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                try
                {
                    string userInput;
                    Console.WriteLine("请输入0-5之间任意一个数字:");
                    userInput = Console.ReadLine();
                    if (string.IsNullOrWhiteSpace(userInput))
                    {
                        break;
                    }


                    if (int.TryParse(userInput, out int index))
                    {
                        if (index < 0 || index > 5)
                        {

                            throw new IndexOutOfRangeException($"你输入的数字是{index}");

                        }
                        Console.WriteLine($"你输入的数字是{index}");
                    }
                    else
                    {
                        throw new Exception("请输入数字");
                    }
                }
                catch (IndexOutOfRangeException ex)
                {
                    Console.WriteLine($"你输入的数字不在此范围内.{ex.Message}");
                }
                catch (Exception ex)
                {

                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    Console.WriteLine("谢谢合做");
                }

               
            }
        }
    }

 

  在此事例中,定义了两个catch块。若是输入的超过规定返回的数字,则会抛出超出范围的错误也就进入对应的catch块。而输入的非数字也就进入了另一个catch块进行处理。spa

  下面咱们看一看关于System.Exception属性。熟悉了解其中熟悉能更好的去观察理解抛出的异常错误。设计


  

过滤异常、建立用户定义的异常

  自从C#6开始就支持异常过滤器。Catch块仅在过滤器但会true时执行。捕获不一样的异常类型时,能够有行为不一样的代码块。在某些状况下,catch块基于异常的内容执行不一样的操做。下面咱们看下如何来使用异常过滤器吧:

 public class MyIndexOutOfException :SystemException
    {
        public MyIndexOutOfException(string message) : base(message)
        {

        }

        public int ErrorCode { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int steInput = 12;

                if (steInput > 10)
                {
                    throw new MyIndexOutOfException("数据超出了范围") { ErrorCode = 1 };
                }

            }

            catch (MyIndexOutOfException ex) when (ex.ErrorCode!=1)

            {
                Console.WriteLine("出现了自定义错误");
            }

            catch (MyIndexOutOfException ex) when (ex.ErrorCode == 1)
            {
                Console.WriteLine(ex.Message);
            }

            catch (Exception ex)
            {

                throw;
            }
        }
    }

 

  上面例子中,自定义了一个异常处理,同时增长ErrorCode,以此来做为过滤条件,利用关键字When+条件来进行过滤。

总结

  本篇文章介绍了异常处理错误的状况及机制,咱们不只能够输出代码好难过的通常错误代码,也能够输出咱们本身定义的特殊错误状况。不管编程技术有多好,程序都必须能处理可能出现的任何错误。对不一样的错误采起相应的应对措施,才是正确编码的其中一步。

 

      不是井里没有水,而是你挖的不够深。不是成功来得慢,而是你努力的不够多。


 

 

               c#基础知识详解系列

 

欢迎你们扫描下方二维码,和我一块儿学习更多的C#知识

  

  

相关文章
相关标签/搜索