《C#程序设计教程 教学课件 ppt 作者 刘瑞新第8章 异常处理、程序调试和文件操作》由会员分享,可在线阅读,更多相关《C#程序设计教程 教学课件 ppt 作者 刘瑞新第8章 异常处理、程序调试和文件操作(21页珍藏版)》请在金锄头文库上搜索。
1、第8章 异常处理、调试和文件操作,本章讲述的主要内容 8.1 异常处理 8.2 应用程序调试 8.3 文件操作类 8.4 数据流,8.1 异常处理,8.1.1 使用trycatchfinally语句捕获和处理异常 trycatchfinally语句将可能引发异常的程序代码,与捕获和处理异常的代码分为两个部分。其语法格式为: try /程序语句; catch(异常类名 异常变量名) /捕获程序语句引发的异常,执行异常处理程序 finally /无论是否出现异常都会执行的语句,8.1 异常处理,8.1.2 抛出异常和常用异常类 1. 抛出异常 通过trycatch语句所捕获到的异常,都是当遇到错误
2、时系统自己报错引发异常,并主动通知运行环境的。但是有时还可能需要在编写代码人为控制什么时候发生异常,以及发生了怎样的异常。Visual Studio提供的throw关键字就是专门用于人为引发异常的。通常将这种人为引发异常的方式称为“抛出异常”。其语法格式为: throw new 异常类; 例如,下列代码将在程序运行时引发一个除数为零的异常。 throw new DivideByZeroException();,8.1 异常处理,8.1.2 抛出异常和常用异常类 1. 抛出异常 通过trycatch语句所捕获到的异常,都是当遇到错误时系统自己报错引发异常,并主动通知运行环境的。但是有时还可能需要
3、在编写代码人为控制什么时候发生异常,以及发生了怎样的异常。Visual Studio提供的throw关键字就是专门用于人为引发异常的。通常将这种人为引发异常的方式称为“抛出异常”。其语法格式为: throw new 异常类; 2. 常用的异常类 在Visual Sdudio中提供了大量的用于判断异常类型的类,例如前面用到的,位于System命名空间的DivideByZeroException。常见的异常类及说明见教材表8-1。,8.1 异常处理,8.1.3 用户自定义异常 由于预定义的异常类不可能包括所有异常,难免在面对某些特殊情况时出现无法捕获的情况。此时,开发人员可以创建自己的,继承于Ex
4、ception类的自定义异常类。声明一个异常类的语法格式为: class 自定义异常类名:Exception /类体语句; 引发自定义异常的格式为: throw(自定义异常类名);,8.2 应用程序调试,8.2.1 程序错误的分类 在编写程序时,经常会遇到各种各样的错误,这些错误中有些是容易发现和解决的,有些则比较隐蔽甚至很难发现。可以将程序中的错误归纳为,语法错误、运行期间错误和逻辑错误三种情况。 1. 语法错误 2. 运行时错误 3. 逻辑错误,8.2 应用程序调试,8.2.1 常用调试窗口 1. 输出窗口 2. 命令窗口 3. 监视窗口 4. 局部变量窗口,8.2 应用程序调试,8.2.
5、2 程序断点和分步执行 1. 程序断点 为了排除程序中的错误,往往需要程序执行到某条语句时暂停下来,以便查看程序的运行状态、变量的取值、属性的内容、当前执行的过程甚至修改程序代码。让程序暂停下来的一种简单方法就是设置断点。 设置断点最常用的方法有以下3种: 1) 将插入点光标置于要设置断点的代码行按下F9键。 2) 直接用鼠标单击语句行首灰色标记区。 3) 鼠标指向某行代码单击右键,在弹出的快捷菜单中执行“断点”下的“插入断点”命令。,8.2 应用程序调试,8.2.2 程序断点和分步执行 2. 程序的分步执行 当已经知道某行语句存在问题时,使用断点查找错误是个有效的方法,但通常程序出错的具体位
6、置并不容易确定,只能够猜测到在某个范围内可能存在问题,这就需要在此范围内跟踪程序的执行结果,一段段甚至一条条地执行语句,同时在调试窗口(如,局部变量窗口)中观察内部数据的变化情况,从而确定问题所在。这种调试方式称为程序的“分步执行”或称为程序的“跟踪”。常用的分步执行有“逐过程”和“逐语句”两种。 (1) 逐语句 (2) 逐过程,8.3 文件操作类,8.3.1 File类 文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合,文件是存储数据的重要单元。用户对文件的操作通常有创建、复制、删除、移动、打开和和追加到文件等。File类提供了大量实现这些功能的方法。 File类没有提
7、供属性成员,常用的方法成员,见教材表8-2。 例如,下列代码将一个字符串追加到c:1.txt文件中。若文件不存在,则创建后再追加文本。由于“”符号在C#语法中表示转义符,故表示路径时使用“”。 File.AppendAllText(“c:1.txt“, “C#应用程序设计“);,8.3 文件操作类,8.3.2 Directory类 为了便于管理文件,一般不会将文件直接放在磁盘根目录,而是创建具有层次关系的文件夹或称目录。对于文件夹的常用操作主要包括新建、复制、移动和删除等。C#中的静态文件夹类Directory提供了这些操作功能。Directory类没有提供属性成员,常用的方法成员,见教材表8
8、-3。 例如,下列代码使用foreach循环遍历指定的文件夹(c:abc),并删除其中所有文件: foreach (string filename in Directory.GetFiles(“c:abc“) File.Delete(filename); ,8.3 文件操作类,8.3.3 DriveInfo类 文件必须保存在物理的存储介质中,例如,硬盘、光盘、U盘等。通常我们将这些存储介质称之为驱动器,C#语言提供的DriveInfo实现了对驱动器相关信息的访问。 1常用属性 DriveInfo类提供了用于获取计算机磁盘相关信息的属性,这些属性都是只读型,见教材表8-4。 2常用方法 Driv
9、eInfo类的方法比较少,常用的方法为GetDrives静态方法。GetDrives静态方法用于检索计算机上的所有逻辑驱动器的驱动器名称,没有参数,返回值类型为DriveInfo数组。,8.4 数据流,流(Stream)是字节序列的抽象概念。例如文件、输入/输出设备、内部进程通信管道或者TCP/IP套接字等。一般来说,流要比文件的范围要更广泛一些,按照流储存的位置可以分为打开并读写磁盘文件的文件流(FileStream)、表示网络中数据传输的网络流(NetworkStream)、内存中数据交换时创建的内存流(MemoryStream)等。 8.4.1 流的操作 1. 流的操作类型 流的操作一般
10、涉及以下三个基本方法: 1) 读取流:读取是从流到数据结构(如字节数组)的数据传输。 2) 写入流:写入是从数据结构到流的数据传输。 3) 查找流:查找是对流内的当前位置进行查询和修改。,8.4 数据流,8.4.1 流的操作 2流的分类 在.NET Framework中,流由抽象基类Stream来表示,该类不能实例化,但可以被继承,由Stream类派生出的常用类包括:二进制读取流BinaryReader、二进制写入流BinaryWriter、文本文件读取流StreamReader、文本文件写入流StreamWriter、缓冲流BufferedStream、文件流FileStream、内存流Me
11、moryStream和网络流NetworkStream。 流的类型尽管很多,但在处理文件的输入/输出(I/O)操作时,最重要的类型为文件流FileStream,这也是本章要介绍的重点内容。,8.4 数据流,8.4.2 文件流 FileStream类用来创建一个文件流,并可以打开和关闭指定的硬盘文件。FileStream继承于抽象类Stream.。文件流可以分只读流,只写流和读写流。读写操作可以指定为同步或异步操作。FileStream对输入输出进行缓冲,从而提高性能。 1FileStream类的常用属性 FileStream类的常用属性及说明,见教材表8-5。 2FileStream类的常用方
12、法 FileStream类的常用方法及说明,见教材表8-6。,8.4 数据流,8.4.2 文件流 3创建FileStream类对象 FileStream类提供实例化对象的构造函数非常多,下面就三种常用的实例化对象方法进行讲述。 FileStream 对象名 = new FileStream(string path,FileMode mode) FileStream 对象名 = new FileStream(string path,FileMode mode,FileAccess access) FileStream 对象名 = new FileStream(string path,FileMo
13、de mode,FileAccess access,FileShare share);,8.4 数据流,8.4.3 文本文件的读写操作 文本文件是一种典型的顺序文件,它是指以ASCII码方式(也称文本方式)存储的文件,其文件的逻辑结构又属于流式文件。文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息。在C#语言中,文本文件的读取与写入主要是通过StreamReader类和SteamWriter类实现。 1. StreamReader类 (1) 创建StreamReader类对象 StreamReader sr = new StreamR
14、eader(Stream stream) 或: StreamReader sr = new StreamReader(string path),8.4 数据流,8.4.3 文本文件的读写操作 文本文件是一种典型的顺序文件,它是指以ASCII码方式(也称文本方式)存储的文件,其文件的逻辑结构又属于流式文件。文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息。在C#语言中,文本文件的读取与写入主要是通过StreamReader类和SteamWriter类实现。 1. StreamReader类 (1) 创建StreamReader类对象 S
15、treamReader sr = new StreamReader(Stream stream) StreamReader sr = new StreamReader(string path) StreamReader sr = new StreamReader(Stream stream, Encoding encoding) StreamReader sr = new StreamReader(string path, Encoding encoding),8.4 数据流,8.4.3 文本文件的读写操作 1. StreamReader类 、 (2) StreamReader类的常用属性和方
16、法 StreamReader类最常用的属性是EndOfStream属性,该属性表示是否已读取到了文件的结尾(true表示已达到结尾)。StreamReader类较为常用的方法见表8-10。,8.4 数据流,8.4.3 文本文件的读写操作 2. SteamWriter类 SteamWriter类是专门用来处理文本文件的类,可以方便的向文本文件中写入字符串。 (1) 创建StramWriter类对象 StreamWriter sw = new StreamWriter(string path, bool append,Encoding encoding) (2) SteamWriter类的常用方法 SteamWriter类常用方法及说明,见教材表8-11。,8.4 数据流,8.4.3 文本文件的读写操作 2. SteamWriter类 SteamWriter类是专门用来处理文本文件的类,可以方便的向文本文件中写入字符串。 (1) 创建StramWriter类对象 StreamWriter s