您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > .NET > .NET课件--第5部分
《.NET技术》1ofpage第一部分Microsoft.NET框架基本原理第二部分类型与通用语言运行时第三部分类型设计第四部分基本类型第五部分类型管理《.NET技术》2ofpage第五部分类型管理•异常•自动内存管理《.NET技术》3ofpage第18章异常《.NET技术》4ofpage18.1异常处理的概念•看以下代码:classProgram{staticvoidMain(string[]args){int[]values=newint[10];for(inti=1;i=10;i++)Console.WriteLine(values[i]);Console.ReadKey();}}《.NET技术》5ofpage18.1异常处理的概念•看以下代码:classProgram{staticvoidMain(string[]args){int[]values=newint[10];for(inti=1;i=10;i++)Console.WriteLine(values[i]);Console.ReadKey();}}C#中数组下标从0开始,因而此代码在运行时将会发生一个“数组访问越界”错误。《.NET技术》6ofpage•类似于这种在程序中隐藏的错误,被称为“异常(Exception)”,它表明程序执行期间出现了一个非法的运行状况,期望程序进行的某项操作没能完成。•注意,异常是在程序运行时间出现的,不是在编译期间出现的,编译器在编译时发现的错误是语法错误,不能称之为异常。•.NETFramework提供了多个异常类,在编程中常用的有以下几个:《.NET技术》7ofpage异常说明System.ArithmeticException在算术运算期间发生的异常的基类System.ArrayTypeMismatchException当向一个数组中存储对象时,如果由于被存储的元素的实际类型与数组的实际类型不兼容而导致存储失败,就会引发此异常System.DivideByZeroException在试图用零作除数时引发System.IndexOutOfRangeException在试图使用小于零或超出数组界限的下标索引数组时引发System.InvalidCastException从基类型或接口到派生类型的显式转换在运行时失败,引发此异常System.NullReferenceException尝试使用未创建的对象,引发此异常System.OutOfMemoryException分配内存(通过new)失败时引发System.OverflowException在checked上下文中的算术运算溢出时引发System.StackOverflowException当执行堆栈由于保存了太多挂起的方法调用而耗尽时,就会引发此异常System.TypeInitializationException在静态构造函数引发异常并且没有可以捕捉到它的catch子句时引发《.NET技术》8ofpage•异常处理的目的是根据不同的异常情况提供不同的处置方法,使程序更稳定、更安全。•异常处理的主要用途是提供准确的错误消息,解释失败的原因、位置和错误类型等,同时提供一定的恢复能力,尽可能地降低出错的机率。《.NET技术》9ofpage使用try、catch和finally处理异常的结构如下:try{//可能引发异常的语句-------------------------try语句块(1)}catch(Exceptione){//对异常进行处理的语句----------------------catch语句块(2)}finally{//“打扫战场”的语句-----------------------------finally语句块(3)}18.2编程实现异常处理18.2.1try、catch和finally《.NET技术》10ofpage•异常处理机制将代码分成3大块。第(1)块是正常执行程序功能的语句块,其中有可能在运行时引发错误。第(2)块在程序正常运行时不会执行,仅当有异常出现时转到此块执行。第(3)块不管程序执行时有无异常出现都会执行。•当程序正常运行时,程序的执行流程为:第(1)块第(3)块当第(1)块中有代码引发了一个异常时,程序的执行流程为:第(1)块第(2)块第(3)块•可以有多个catch语句块,每个代码块捕获一种异常(由catch后的参数类型决定,称为“异常筛选器(ExceptionFilter)”)。.NETFramework中使用catch语句只能捕获Exception类及其子类的对象。•当一个异常被引发后,如果应用程序没有提供合适的异常处理代码,应用程序进程将会被CLR强制中止。《.NET技术》11ofpage•异常处理机制将代码分成3大块。第(1)块是正常执行程序功能的语句块,其中有可能在运行时引发错误。第(2)块在程序正常运行时不会执行,仅当有异常出现时转到此块执行。第(3)块不管程序执行时有无异常出现都会执行。•当程序正常运行时,程序的执行流程为:第(1)块第(3)块当第(1)块中有代码引发了一个异常时,程序的执行流程为:第(1)块第(2)块第(3)块•可以有多个catch语句块,每个代码块捕获一种异常(由catch后的参数类型决定,称为“异常筛选器(ExceptionFilter)”)。.NETFramework中使用catch语句只能捕获Exception类及其子类的对象。•当一个异常被引发后,如果应用程序没有提供合适的异常处理代码,应用程序进程将会被CLR强制中止。《.NET技术》12ofpage•异常处理机制将代码分成3大块。第(1)块是正常执行程序功能的语句块,其中有可能在运行时引发错误。第(2)块在程序正常运行时不会执行,仅当有异常出现时转到此块执行。第(3)块不管程序执行时有无异常出现都会执行。•当程序正常运行时,程序的执行流程为:第(1)块第(3)块当第(1)块中有代码引发了一个异常时,程序的执行流程为:第(1)块第(2)块第(3)块•可以有多个catch语句块,每个代码块捕获一种异常(由catch后的参数类型决定,称为“异常筛选器(ExceptionFilter)”)。.NETFramework中使用catch语句只能捕获Exception类及其子类的对象。•当一个异常被引发后,如果应用程序没有提供合适的异常处理代码,应用程序进程将会被CLR强制中止。《.NET技术》13ofpage注意:指定由逗号分开的catch参数表是语法错误,catch只能有一个参数,即一条catch语句只能捕获此参数限定的那种类型的异常。另外,在某个try块后有两个不同的catch块捕获两个相同类型的异常也是语法错误。•finally语句块是可选的,主要用于解决资源泄露问题,它位于catch语句块之后,CLR保证它们一定执行。注意:finally语句块中也可能发生异常,如果这种情况发生,先前的异常被放弃。•程序中也可使用throw关键字主动地抛出一个异常:thrownewException(“我的新异常对象”);《.NET技术》14ofpage•上节中引发“数组访问越界”错误的代码可以用异常处理机制重写如下:classProgram{staticvoidMain(string[]args){int[]values=newint[10];try{for(inti=1;i=10;i++)Console.WriteLine(values[i]);}《.NET技术》15ofpagecatch(IndexOutOfRangeExceptione){Console.WriteLine(“在输出values数组值时发生数组越界错误”);Console.WriteLine(“异常种类:”+e.GetType().Name);Console.WriteLine(“系统给出的出错信息:”+e.Message);Console.WriteLine(“系统调用堆栈信息:”+e.StackTrace);Console.WriteLine(“引发此错误的方法:”+e.TargetSite);}Console.ReadKey();}}《.NET技术》16ofpage当程序运行时,异常提示信息如下:在输出values数组值时发生数组越界错误异常种类:IndexOutOfRangeException系统给出的出错信息:索引超出了数组界限系统调用堆栈信息:在OnlyTest.Program.Main(String[]args)位置C:\OnlyTest\Program.cs:行号11引发此错误的方法:VoidMain(System.String[])《.NET技术》17ofpage•.NETFramework异常处理的核心是Exception类,它是所有可捕获异常类的基类,程序发生异常时,CLR会创建一个相应种类的异常对象来表示该异常。•Exception对象e的3个重要属性。属性用途e.GetType().Name了解异常的类型名,此名字可用于在下一步编程中有针对性地对此类型异常进行处理e.Message告诉用户发生了什么事e.StackTrace确定错误发生的位置,如果有可用的调试信息,还可显示源文件名和程序行号《.NET技术》18ofpage.NETFramework实现的异常处理具有以下特点:处理异常时不用考虑生成异常的语言或处理异常的语言。异常处,理时不要求任何特定的语言语法,而是允许每种语言定义自己的语法。允许跨进程甚至跨计算机边界引发异常。为达以上目的,CLR为每个正在运行的程序创建了一个异常信息表。在异常信息表中,程序中每个方法都有一个关联的异常处理信息数组。如果方法中有受到保护的语句块,则此方法相关联的异常处理信息数组中就记录了当异常发生时,CLR自动调用异常处理代码所需的相关信息。如果某方法中没有受保护块,则其对应的异常处理信息数组为空。提示:被try…catch包围的语句块称为受保护块。18.2.2CLR结构化异常处理原理《.NET技术》19ofpage•当某一方法中发生异常时,CLR在此方法对应的异常处理信息数组中搜索,以确定是哪一个受保护块引发的异常,以及应该由哪个catch块处理。(1)如果找到以上信息,CLR创建一个Exception对象(或其子类对象)来描述该异常。然后,CLR执行处理该异常的catch语句块,如果有finally语句块,接着执行finally语句块。(2)如果在当前方法中没有找到相关信息,则CLR搜索当前方法的每一个调用方,在调用者的异常处理信息数组中搜索,直到最顶层的调用者。这个由底向上的搜索过程,其信息被记录在一个堆栈中,称为“异常堆栈”。(3)如果任何调用者都没有处理这种异常的代码,则CLR允许使用一个调试器来处理该异常。如果用户放弃调试,则CLR引发一个UnhandledException事件,而这时如果应用程序也没有编写响应UnhandledException事件的代码,则CLR会结束此进程。《.NET技术》20ofpagepublicvoidSomeMethod(){try{//这里执行一些操作}catch(NullReferenceExceptione){//处理一个空引用异常}catch(InvalidCastExceptione){//处理一个无效转型异常}catch{//在C#中,该筛选器会捕获任何异常//处理所有异常}}《.NET技术》21ofpage首先创建一个自定义的异常类MyException。classMyException:Exception{publicMyException(Stringinfo):base(info){}}接着,编写代码实现以下的方法调用链,在SomeFunc()方法中引发一个Exception异常。Main()FuncInvoker()SomeFunc()具体代码如下:异常的传播过程《.NET技术》22ofpagestaticvoidMain(s
本文标题:.NET课件--第5部分
链接地址:https://www.777doc.com/doc-7028659 .html