




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 程序的生成、异常处理和调试 7.1 异常处理7.1.1 异常类7.1.2 try-catch7.1.3 try-catch-finally7.1.4 多重try结构7.1.5 默认异常处理7.1.6 throw7.1.7 用户自定义异常7.2 Visual Studio 2017的调试功能目 录7.1.1 异常类 专业的程序必须能够处理异常情况。在.NET以前的编程语言中,这常常称作错误处理。意外的情况会生成错误代码,程序捕捉这段代码并采取相应的措施。 .NET的公共语言运行库并不产生错误代码。在出现异常情况时,CLR创建一个称作异常的特殊对象,该对象中的属性和方法详细描述了异常情况以
2、及引起错误的具体原因。 .NET处理的是异常而不是错误,因此在.NET中不再使用术语“错误处理”,改用“异常处理”。异常处理指的是发现异常时采取相应措施的.NET技术。 .NET实现了系统范围内功能强大的错误处理方式,.NET中不再使用错误符号,而使用异常对象。异常对象是一个包含错误相关信息的对象,这些信息显示为该对象的属性。异常对象是派生于System.Exception类的一个实例,System.Exception类有许多子类用于不同的异常情况。7.1 异常处理7.1.1 异常类 在C#语言中使用异常类和异常处理需要用到几个关键字,它们是: try:开始一段可能出现错误的代码。这段代码常常
3、称为 try块。 catch:为一种类型的异常开始一个错误处理程序。catch跟在try块的后面,try结构可以有多个catch块,每个catch块都捕获不同类型的异常。在try块中遇到错误时,开始执行第一个与异常类型匹配的catch块。 finally:包含在try块正常结束时执行的代码,或者catch块执行完毕后执行的代码。也就是说,无论是否检测到异常,finally块中的代码总是会执行。finally块一般用于关闭或删除资源,例如数据库连接,如果没有清理这类资源,代码就会出问题。 throw:生成一个错误,在catch块中可以用它把异常送回给调用例程,如果某个例程检测到传入参数类型错误,
4、也可以用它抛出异常。7.1 异常处理7.1.2 try-catch try-catch 语句由一个 try 块后跟一个或多个 catch 子句构成,这些子句指定不同的异常处理程序。引发异常时,公共语言运行时 (CLR) 会查找处理此异常的 catch 语句。如果当前执行的方法不包含这样的 catch 块,则 CLR 会查看调用当前方法的方法,然后会遍历调用堆栈。如果找不到 catch 块,则 CLR 会向用户显示一条有关未处理异常的消息并停止执行程序。7.1 异常处理7.1.2 try-catch 虽然可以使用不带参数的 catch 子句捕捉任何类型的异常,但不推荐这种用法。通常,应该只捕捉那
5、些知道如何从中恢复的异常。因此,应该总是指定一个从 System.Exception 派生的对象参数。例如:catch (InvalidCastException e) 7.1 异常处理7.1.2 try-catch 在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。将先捕获特定程度较高的异常,而不是特定程度较小的异常。如果对 catch 块进行排序以使永远不能达到后面的块,编译器将产生错误。例7-27.1 异常处理7.1.2 try-catch在 catch 块中可以使用 throw 语
6、句再次引发已由 catch 语句捕获的异常。例如:catch (InvalidCastException e) throw (e); / 再次引发已由 catch 语句捕获的异常同时也可以引发新的异常。下面的例子中将捕捉的异常指定为内部异常:catch (InvalidCastException e) / 引发自定义的新异常 throw new CustomException(Error message here., e);如果要再次引发当前由无参数的 catch 子句处理的异常,则使用不带参数的 throw 语句。例如:catch throw;7.1 异常处理7.1.2 try-catch
7、在 try 块内部时应该只初始化其中声明的变量;否则,完成该块的执行前可能发生异常。例如,在下面的代码示例中,变量 x 在 try 块内初始化。试图在 Write(x) 语句中的 try 块外部使用此变量时将产生编译器错误:使用了未赋值的局部变量。 7.1 异常处理7.1.2 try-catchstatic void Main() int x; try / 不能在此处初始化声明的变量 x = 123; catch /此处可能会引发异常:使用了未赋值的局部变量 Console.Write(x); 7.1 异常处理7.1.3 try-catch-finally finally 块用于清除 try
8、块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。控制总是传递给 finally 块,与 try 块的退出方式无关。 catch 用于处理语句块中出现的异常,而 finally 用于保证代码语句块的执行,与前面的 try 块的退出方式无关。 finally 块中的语句不管异常是否触发都会被执行。 catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源。 7.1 异常处理7.1.3 try-catch-finally 例7-3演示了一个典型的使用try-catch-finally结
9、构的情景,在try块中占用了一个对文件object类型的变量o拆箱并引发一个IOException异常,在catch块中对异常进行捕获但不做任何处理,在finally块中输出i。finally块保证了不管程序运行过程中是否产生异常都能正确释放程序运行时所占用的系统资源。 7.1 异常处理7.1.4 多重try结构所谓多重try结构就是指一个try块可以嵌套在另一个try 块中。在内部try块中生成但没有被与该try关联的catch捕获的异常会传播到外部try块中。 7.1 异常处理7.1.4 多重try结构 在例7-4中,可以被内部try处理的异常(在本例中是除以零错误)允许程序继续执行。然而
10、,数组边界错误被外部try捕获,从而导致程序终止。虽然这不是使用多重try结构的唯一原因,但是从前面的程序可以概括出下面的要点:多重try结构经常用来以不同的方式处理不同类型的错误。有些错误的类型是灾难性的,不能修复。有些则不太重要,可以立即处理。很多程序员使用外部try块来捕获最严重的错误,允许内部try块处理不太严重的错误。也可以使用外部try块作为“捕获所有异常”的块,以此来捕获内部try块没有处理的错误。 7.1 异常处理7.1.5 默认异常处理 有时引发了一个异常后,代码中没有catch块能处理这类异常。例如,假定忽略FormatException和通用的catch块,只有处理Ind
11、exOutOfRangeException的块。此时,如果引发一个FormatException异常,会发生什么情况呢? 答案是.NET运行库会捕获它。.NET运行库可以把整个程序放在另一个更大的try快中,每个.NET程序都会这么做。这个try块有一个catch处理程序,它可以捕获任何类型的异常。如果代码没有处理发生的异常,程序流就会退出程序。由.NET运行库中的catch块捕获它。但是,结果并不是你想像的那样。代码的执行会即时中断,并给用户显示一个对话框,通知用户代码没有处理异常,并给出.NET运行库能检索到的异常信息。7.1 异常处理7.1.6 throw throw 语句用于发出在程序
12、执行期间出现反常情况(异常)的信号。引发的异常是一个对象,该对象的类是从 System. Exception 派生的,例如:class MyException : System.Exception / .throw new MyException(); 通常 throw 语句与 try-catch 或 try-finally 语句一起使用,throw 语句也可以用于重新引发已捕获的异常。 在例7-5中,当索引超过数组长度时,通过throw抛出了一个IndexOutOfRangeException异常实例。7.1 异常处理7.1.7 用户自定义异常一般情况下,我们使用系统内部提供的异常就足够了,
13、但是有时为了特殊的目的,必须使用用户自定义异常。 无论我们使用的是系统自定义异常,还是用户自定义异常,它们都具有相同的异常处理机制,都包括定义异常类、抛出异常对象和捕获并处理异常三部分,只不过是前两个过程已经在.NET框架中定义好了。 异常类本身和一般的类的定义没有任何区别,但是由于使用throw关键字和catch关键字所抛出和捕获的异常对象必须是Exception类或者Exception类子类的子类对象,因此所有用户自定义的异常类必须由Exception类或者Exception类的子类派生。7.1 异常处理7.1.7 用户自定义异常 由于异常属于意外事件,并不是总是发生,所以必须有一个条件判
14、断语句if(满足抛出异常条件);然后再抛出异常throw new Excrption,比如:if(y = 0)/如果被除数为零 /抛出DivideByZeroException异常类对象; throw new DivideByZeroException(); catch关键字用于捕获在try程序块中所引发的异常,根据该关键字所携带的参数列表的不同具有多种重载方式,但是所有的catch重载块最多只有一个被执行。比如:catch(DivideByZeroException dz)Console.WriteLine(dz.ToStirng();7.1 异常处理7.1.7 用户自定义异常 例7-6中,
15、首先我们建立自己的C#异常类 CustomerException,它要继承自Exception类,然后声明一个带参数构造函数,该构造函数调用基类的带参数构造函数设置当前异常的消息。在ThrowCustomException函数中,通过throw关键字人为抛出一个CustomerException异常。在Main函数中通过try语句块调用ThrowCustomException函数,这时就可以捕获到用户自定义的CustomerException异常,然后在catch语句块中获取异常实例,并在控制台中输出异常消息。7.1 异常处理 首先需要了解是断点(breakpoint):一个对调试器的指令,可
16、以使调试器运行到应用程序特定的某一行然后停止。设置断点最简单的方式是在应用程序源代码的某一特定行左边点击。断点设置成功后,IDE会用一个红点标记断点7.2 Visual Studio 2017的调试功能 如果要开始对代码进行调试可以选择IDE菜单“调试开始调试”,或者按F5键。程序会编译并运行到断点,此时它会停下来,有一个黄色箭头指向下一步要执行的语句7.2 Visual Studio 2017的调试功能到达断点后,查看各对象的值很容易。例如,可以把光标放在变量上等一会儿,就能看到它的值7.2 Visual Studio 2017的调试功能调试器IDE还提供了许多有用的窗口,如“局部变量”窗口会显示所有局部变量的值7.2 Visual Studio 2017的调试功能对象显示的是类型及一个加号,可以打开它们看看内部数据在调试状态下,按F11键可以单步执行到下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人放款方式借款合同
- 状元境地块拆迁合同8篇
- 2025年黑龙江货运从业资格证考试题目答案大全
- 《数据可视化技术应用》2.1 呈现整体销售数据图景-教案
- 2025年安徽货运从业资格考试题目及答案解析大全
- 2025年山东货运资格证考试题库
- 存储器战略市场规划报告
- 垂线 教案 2024-2025学年北师大版数学七年级下册
- 办公用房租赁合同范本
- 个人车库互换合同范本
- 生物产品检验检疫基础知识单选题100道及答案
- 江苏省中职《英语》学业水平考试备考试题集(含历年真题)
- 2025年合伙型公司新合伙人加入协议
- 2025年安全员之C证(专职安全员)考试题库
- 2025城市商铺买卖合同书
- 医院感染及其危害
- 2025年佳木斯职业学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年春新北师大版物理八年级下册课件 第六章 质量和密度 第一节 物体的质量及其测量
- 《临床科研思维》课件
- 大学生创新创业基础(创新创业课程)完整全套教学课件
- 人教版小学数学四年级下册第一单元测试卷附答案(共9套)
评论
0/150
提交评论