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

来源:互联网 发布:淘宝三国杀ol卡是什么 编辑:程序博客网 时间:2024/05/16 08:08


            /* 错误与异常
             * 原因:出于某些意外情况,只返回错误代码无法满足代码的需求,对于出现错误的地方,可能由于嵌套比较多,需要跳出嵌套。于是我们就需要异常类中的
             * 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中去寻找相应的异常,直到找到为止
             * 如果是从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);
        }


0 0
原创粉丝点击