第13章异常处理和不安全代码 主要内容 本章主要介绍程序的异常处理,内容包括异常处理的机制、 捕捉异常、异常处理、抛出异常、重抛异常、异常链接;还 包括指针以及不安全代码的处理。本章学习的目标包括:理 解异常机制和异常类的层次结构;掌握异常处理的一般步骤 和过程;能够自定义异常类和重抛异常;理解C#中对不安全 代码的管理
第13章 异常处理和不安全代码 本章主要介绍程序的异常处理,内容包括异常处理的机制、 捕捉异常、异常处理、抛出异常、重抛异常、异常链接;还 包括指针以及不安全代码的处理。本章学习的目标包括:理 解异常机制和异常类的层次结构;掌握异常处理的一般步骤 和过程;能够自定义异常类和重抛异常;理解C#中对不安全 代码的管理。 主要内容
131基本概念 异常( Exception)是指程序执行期间发生了问题,一般是非 预料之中的错误。有异常的程序通常是指有可能发生问题,但 并不频繁。例如,x和y为浮点数,做除法x/y时,通常情况下 能够正确执行;可当y为0时就会出现问题,这时,系统会终止 正在运行的程序 通常情况下,异常会终止用户程序,并发出一条系统提供的错 误信息。 异常处理( Exception Handing)指的是一种机制或者方法, 通过它,用户创建的应用程序能够解决或处理异常。一般情况 下,通过对异常进行处理,程序就如同没有出现过问题一样可 以继续执行,而不是被强行终止
13.1 基本概念 异常(Exception)是指程序执行期间发生了问题,一般是非 预料之中的错误。有异常的程序通常是指有可能发生问题,但 并不频繁。例如,x和y为浮点数,做除法x/y时,通常情况下 能够正确执行;可当y为0时就会出现问题,这时,系统会终止 正在运行的程序。 通常情况下,异常会终止用户程序,并发出一条系统提供的错 误信息。 异常处理(Exception Handing)指的是一种机制或者方法, 通过它,用户创建的应用程序能够解决或处理异常。一般情况 下,通过对异常进行处理,程序就如同没有出现过问题一样可 以继续执行,而不是被强行终止
131.1异常类 在面向对象的语言中,异常是面向对象规范的一部分。异常 也称为差错或违例,是特殊的运行错误对象,对应着C#特定 的运行错误处理机制 C#提供一个标准类 System Exception,是出现运行错误时,系 统或用户引发的一个对象或者一个对象的基类。C#有一个异 常处理机制,但只允许引发和捕捉 Exception类的对象及其派 生类
13.1.1 异常类 在面向对象的语言中,异常是面向对象规范的一部分。异常 也称为差错或违例,是特殊的运行错误对象,对应着C#特定 的运行错误处理机制。 C#提供一个标准类System.Exception,是出现运行错误时,系 统或用户引发的一个对象或者一个对象的基类。C#有一个异 常处理机制,但只允许引发和捕捉Exception类的对象及其派 生类
1312异常的层次结构 System Exception是C#异常的基类,其派生类包括以下几类: ■ System Application Exception:最重要的派生类之一。它由用户程序而不是 由公共语言运行库引发,作为一种区分应用程序定义的异常与系统定义的异常 的方法而提供。 System IC. Isolated Storage. IsolatedStorage Exception:独立存储异常,在缺 少证据或无效操作时发生。 System. Runtime Remoting. MetadataServices SUDSGenerator Exception: HE 成web服务描述语言WSDL的过程中发生错误时将引发的异常,由远程处理 WSDL生成器生成。 System. Runtime Remoting. MetadataServices SUDSParser Exception: T web服务描述语言WSDL的过程中发生错误时将引发的异常,由远程处理 WSDL分析器生成。 System SystemException:最重要的派生类之一。当发生非致命的、可由用 户程序恢复的错误时,公共语言运行时引发该类对象。 ■ System. Windows. Forms, AxHost. InvalidActiveXState Exception:引用处于无 效状态的 ActiveX控件时引发的异常
13.1.2 异常的层次结构 System.Exception是C#异常的基类,其派生类包括以下几类: ◼ System.ApplicationException:最重要的派生类之一。它由用户程序而不是 由公共语言运行库引发,作为一种区分应用程序定义的异常与系统定义的异常 的方法而提供。 ◼ System.IO.IsolatedStorage.IsolatedStorageException:独立存储异常,在缺 少证据或无效操作时发生。 ◼ System.Runtime.Remoting.MetadataServices.SUDSGeneratorException:生 成Web服务描述语言WSDL的过程中发生错误时将引发的异常,由远程处理 WSDL生成器生成。 ◼ System.Runtime.Remoting.MetadataServices.SUDSParserException:分析 Web服务描述语言WSDL的过程中发生错误时将引发的异常,由远程处理 WSDL分析器生成。 ◼ System.SystemException:最重要的派生类之一。当发生非致命的、可由用 户程序恢复的错误时,公共语言运行时引发该类对象。 ◼ System.Windows.Forms.AxHost.InvalidActiveXStateException:引用处于无 效状态的ActiveX 控件时引发的异常
1313公共异常类 System ArithmeticException:在算术运算期间发生的异常(如 ystem Divide by zeroException和 System Overflow Exception)的基类。 stem Array Type Mismatch Exception:当存储一个数组时,如果由于被存储的元素 的实际类型与数组的实际类型不兼容而导致存储失败,就会引发此异常 System Divide By ZeroException:在试图用零除整数值时引发。 ystem Index OutofRange Exception:在试图使用小于零或超出数组界限的下标索引 数组时引发。 System. Invalid CastException:当从基类型或接口到派生类型的显式转换在运行时失 败时,就会引发此异常。 System. NullReference Exception:在需要使用引用对象的场合,如果使用nul引用, 就会引发此异常 ystem. OutOfMemory Exception:在分配内存(通过new)的尝试失败时引发。 ystem Overflow Exception:在 checked上下文中的算术运算溢出时引发 System StackOverflow Exception:当执行堆栈由于保存了太多挂起的方法调用而耗尽 时,就会引发此异常;这通常表明存在非常深或无限的递归 System. TypeInitialization Exception:在静态构造函数引发异常并且没有可以捕捉到它 的 catch子句时引发
13.1.3 公共异常类 ◼ System.ArithmeticException:在算术运算期间发生的异常(如 System.DivideByZeroException 和 System.OverflowException)的基类。 ◼ System.ArrayTypeMismatchException:当存储一个数组时,如果由于被存储的元素 的实际类型与数组的实际类型不兼容而导致存储失败,就会引发此异常。 ◼ System.DivideByZeroException:在试图用零除整数值时引发。 ◼ System.IndexOutOfRangeException:在试图使用小于零或超出数组界限的下标索引 数组时引发。 ◼ System.InvalidCastException:当从基类型或接口到派生类型的显式转换在运行时失 败时,就会引发此异常。 ◼ System.NullReferenceException:在需要使用引用对象的场合,如果使用 null 引用, 就会引发此异常 ◼ System.OutOfMemoryException:在分配内存(通过 new)的尝试失败时引发。 ◼ System.OverflowException:在 checked 上下文中的算术运算溢出时引发。 ◼ System.StackOverflowException:当执行堆栈由于保存了太多挂起的方法调用而耗尽 时,就会引发此异常;这通常表明存在非常深或无限的递归。 ◼ System.TypeInitializationException:在静态构造函数引发异常并且没有可以捕捉到它 的 catch 子句时引发
132异常处理 ■1321异常处理的一般步骤 成运行时 异常处理代 动 抛出 当异常发生时,首先抛出异”心 常,可以由系统自动生成异 对象 常对象,也可以由用户强制 抛出异常对象;将异常对象 终止程 抛给运行时系统以后,系统 就开始捕捉异常,如果捕获 到该异常对象,则进行相应 图13.1异常处理的一般步骤 的处理,找不到处理代码, 则终止系,退出程序
13.2 异常处理 ◼ 13.2.1 异常处理的一般步骤 异常发生 抛出 异常 强 制 抛 出 生 动 自 成 异常类 对象 捕 获 异 常 异常类 对象 图13.1 异常处理的一般步骤 当异常发生时,首先抛出异 常,可以由系统自动生成异 常对象,也可以由用户强制 抛出异常对象;将异常对象 抛给运行时系统以后,系统 就开始捕捉异常,如果捕获 到该异常对象,则进行相应 的处理,找不到处理代码, 则终止系,退出程序
1322抛出异常 根据异常处理的一般步骤,第一步抛出异常时,有两种方式。 如果是系统自动生成异常类对象,则无需写任何代码。例如,整数 除法运算中,如果分母为零,就会引发一个 System. DivideBy ZeroException 如果是强制抛出,则使用 throw语句来实现, throw语句用于立即无 条件地引发异常,控制永远不会到达紧跟在 throw后面的语句 thrw语句的形式为: throw[异常对象]; 其中异常对象是可选项,引发的异常是从类 System Exception派生 的对象
13.2.2 抛出异常 根据异常处理的一般步骤,第一步抛出异常时,有两种方式。 如果是系统自动生成异常类对象,则无需写任何代码。例如,整数 除法运算中,如果分母为零,就会引发一个 System.DivideByZeroException。 如果是强制抛出,则使用throw语句来实现,throw语句用于立即无 条件地引发异常,控制永远不会到达紧跟在throw后面的语句。 throw语句的形式为: throw [异常对象]; 其中异常对象是可选项,引发的异常是从类System.Exception派生 的对象
1323捕获处理异常(1) ■13.2.3.1try- catch try- catch语句由一个try块和后面跟的一个或多个 catch子句构成,一般格式: ;∥可能引发异常的语句 catch(异常对象声明1 ∥)包含异常处理,异常信息显示等 catch(异常对象声明 ∥l包含异常处理,异常信息显示等
13.2.3 捕获处理异常(1) ◼ 13.2.3.1 try-catch try-catch语句由一个try块和后面跟的一个或多个catch子句构成,一般格式: try { ……; //可能引发异常的语句 } catch (异常对象声明1){ ……;//包含异常处理,异常信息显示等 } ……; catch (异常对象声明n){ ……;//包含异常处理,异常信息显示等 }
1323捕获处理异常(2) , a 13.2.3.2 try-finally fnay块用于清除在try块中分配的任何资源。控制总是传递给ⅲnaly块, try块的存在方式无关,即使不具有异常条件,fnay块中的语句仍然被执行 此语句的形式如下 ;∥)含应引发异常的代码段。 finally ;∥包含异常处理程序和清理代码 3 finally-block
13.2.3 捕获处理异常(2) ◼ 13.2.3.2 try-finally finally块用于清除在try块中分配的任何资源。控制总是传递给finally块,与 try块的存在方式无关,即使不具有异常条件,finally块中的语句仍然被执行。 此语句的形式如下: try { ……;//包含应引发异常的代码段。 } finally { ……;//包含异常处理程序和清理代码。 } finally-block
1323捕获处理异常(3) 集,, a 13.2.3.3 try-catch-finally 其格式如下 try i ;/可能引发异常的语句} catch(异常对象声明1){ ;∥包含异常处理,异常信息显示等 catch(异常对象声明n){ ;∥包含异常处理,异常信息显示等 finally i ;∥包含异常处理,异常信息显示等
13.2.3 捕获处理异常(3) ◼ 13.2.3.3 try-catch-finally 其格式如下: try { ……; //可能引发异常的语句 } catch (异常对象声明1) { ……;//包含异常处理,异常信息显示等 } ……; catch (异常对象声明n){ ……;//包含异常处理,异常信息显示等 } finally { ……;//包含异常处理,异常信息显示等 }