您的位置:首页 > 编程语言 > C#

C# ErrorsAndExceptions- 错误与异常的学习-《C#高级编程》学习笔记

2017-03-21 13:57 337 查看
            /* 错误与异常

             * 原因:出于某些意外情况,只返回错误代码无法满足代码的需求,对于出现错误的地方,可能由于嵌套比较多,需要跳出嵌套。于是我们就需要异常类中的

             * try 。。。catch。。。finally 方法

             * 

             * 异常种类:除了IOException和CompositionException类,一般异常类都在System名称空间下,即systemExcetpion类。这三个类都派生于最初的父类Exception类

             * Exception类中比较重要的两个异常类:applicationException类和systemException类

             * applicationException类:原本用于自定义程序异常类的基类。后多用Exception基类派生自定义类

             * systemException类:用于.net运行库抛出的异常,几乎可以由所有应用程序抛出的异常,有非常一般的本质,包含大部分的异常情况。

             * 大部分的异常类大多数都是用于更加准确的定义错误的原因,相比较他们的基类,没有额外的功能。(实际自定义时,可能要经常添加额外的属性)

             * 

             * try 。。。catch。。。finally 方法

             * 

             * try

             * {

             *  用于执行代码中正常的操作,但是这部分操作可能会产生某些错误或者异常

             * }

             * catch

             * {

             *  这里的代码用于处理try代码块中可能产生的错误和异常,也能在这里记录错误

             * }

             * finally

             * {

             *  这里的代码是用于收尾,清理资源或者是在try和catch结尾要做的操作。

             *  1.finally这段是可选的,如果没有需要在try和catch之后执行的操作,这块代码可以省略,不写finally块

             *  2.如果有finally块,那么finally块一定会被执行,无论是否有异常抛出即无论是否执行catch块。

             * 

             * 

             * 流程

             * 1 执行try块中的代码

             * 2 代码有错误 跳转到3,代码没错误,跳转到4

             * 3 执行catch中的代码,结束后跳转到4

             * 4 如果有finally块,则执行finally块中的代码,然后流程结束。如果没有就直接结束try-catch流程。

             * 

             * 备注,可以有多个catch块,处理不同的错误,但是不应该包含太多,影响性能。

             * 

             */

            //代码

            

            bool Overflow = false;

            bool OutOfBounds = true;

            try

            {

                if (Overflow == true)

                    throw new OverflowException();

                if (OutOfBounds == true)

                    throw new IndexOutOfRangeException();

            }

            catch (OverflowException ex)

            {

                Console.WriteLine("You catch a exception and the message is "+ex.Message);

            }

            catch(IndexOutOfRangeException ex)

            {

                Console.WriteLine("You catch a exception and the message is " + ex.Message);

            }

            finally

            {

                Overflow = false;

                OutOfBounds = false;

            }

            

            /*设置Overflow和OutOfBounds 都为true时,运行代码,命令行中只输出You catch a exception and the message is Arithmetic operation resulted in an overflow.

             * 说明 1 try-catch已经成功捕获到了OverflowException ,并且打印了信息。

             *      2 当系统发现一个throw异常情况之后,他会立刻推出栈上所有方法的调用,即在例子中停止try中后续的代码执行,然后去查找合适的catch块的开头,所以我们只能打印出

             *      第一个异常的信息。

             *当我们把overflow设置成false时,输出You catch a exception and the message is Index was outside the bounds of the array. 说明第二个异常已经被捕获。

             */

            /*

             * 让用户多次输入一个数字,数字必须在0-5之间,如果不在这个区间内,则不能正确的处理这个数字。程序抛出异常,要求用户再输入新的数字,直到用户不再输入数字为止

             * Console.ReadLine() 获取用户输入的字符串,经过convert.toint32方法,转换成int类型

             * break语句用来退出while循环和try语句,注意,如果有finally块时,退出try语句一定会执行finally模块。一旦结束finally块以后,就会执行下一条语句,如果没有

             * finally块时,该语句也会执行

             *  catch exception 这段代码中还调用了三个系统方法 readline,writeline和covert.toint方法,所以用exception去接收异常。例如输入文字的时候

             *  catch块的顺序很重要,由于处理完catch中的事情之后,就会进入finally块,所以在多个catch块中,越是需要特殊处理的异常错误,越是要早编写,

             *  把一般的块,处理大部分普通情况的块放到后面去。

             */

             

            while (true)

            {

                try

                {

                    string inputStr;

                    Console.Write("Please intput a number between 0~5 " + "(or hit return to exit)>");

                    inputStr = Console.ReadLine();

                    //如果为空就直接退出

                    if (inputStr == "")

                        break;

                    int index = Convert.ToInt32(inputStr);

                    //判断数字

                    if (index > 5 || index < 0)

                        throw new IndexOutOfRangeException();

                    Console.WriteLine("Your number is " + index);

                }

                catch (IndexOutOfRangeException ex)

                {

                    Console.WriteLine("The number should between 0~5.{0}", ex.Message);

                }

                catch (Exception ex)

                {

                    Console.WriteLine("An exception was thrown.The message is {0}",ex.Message);

                }

                finally

                {

                    Console.WriteLine("Thx");

                }

            }

            

            /*

             *exception 有很多属性

             * data 这个属性可以给异常添加键/值语句,提供额外的关于异常的信息

             * helplink 链接到要一个帮助文档上,提供更多信息

             * innerexception 如果是在catch中抛出的,就会把代码发送到catcah块中的异常对象

             * message 描述文本

             * source 导致异常的应用程序名或者对象名

             * stacktrace 栈上方法调用的详细信息,有助于跟踪抛出异常的方法

             * targetsite 描述抛出异常方法的.net反射对象 

             * 

             * 例子

             */

            try

            {

                Exception ex = new Exception("innerException");

                var myexception = new myExceptionClass("help",ex);

                myexception.Source = "study_day1";

                myexception.HelpLink = "fake.txt";

                myexception.Data.Add("message1", "help");

                myexception.Data["time"] = DateTime.Now;

                throw myexception;

                

            }

            catch (myExceptionClass ex)

            {

                Console.WriteLine(ex.Message);

                Console.WriteLine(ex.Data["time"]);

                if(ex.InnerException != null)

                  Console.WriteLine(ex.InnerException.Message);

            }

            finally

            {

                Console.WriteLine();

            }

            /*

             * 如果有多个try catch嵌套

             * 如果从try中抛出的异常,就去找对应catch中的处理,如果没有,到上一级的catch中去寻找相应的异常,直到找到为止

         
9e43
   * 如果是从catch中抛出的异常,就直接到上一级的catch中去寻找相应的异常,直到找到为止。

             * 每个阶段中,当退出catch块后就会执行对应的finally块。

             */

            /*

             *内部嵌套异常,innerexception

             * 可以在处理异常的catch中去判断是否有内部异常,可以知道内部异常的具体信息,从而更加精确定位异常出现的问题。 
             */

myExceptionClass 类代码

namespace study_day1

{

    class myExceptionClass:Exception

    {

        public myExceptionClass(string message) : base(message)

        {

        }

        public myExceptionClass(string message, Exception ex) : base(message, ex)

        {

        }

    }

}

//调用者信息

 class Program

    {

        

        static void Main(string[] args)

        {

 /*

             * 调用者信息 

             * callerLine,CallerFilePath,CallerMemberName

             * 分别用于显示调用的行数,调用的路径,调用的方法名称

             * 使用时需要先导入system.runtime.compilerserices

             */

            var p = new Program();

            p.getLog();

}

      }

  public void getLog([CallerMemberName] string memberName = "", [CallerLineNumber] int line = 0, [CallerFilePath] string path = ""

               )

        {

            Console.WriteLine((line < 0) ? "no line" : "line " + line);

            Console.WriteLine((memberName == null) ? "no member" : memberName);

            Console.WriteLine((path == null) ? "no path" : path);

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# 编程 异常