第07章 处理异常和错误
程序设计中的错误处理与异常处理

程序设计中的错误处理与异常处理在程序设计中,错误和异常是难以避免的问题。
无论是在开发过程中还是在程序实际运行中,都可能会出现错误和异常情况。
为了确保程序的稳定性和可靠性,开发者需要合理地进行错误处理和异常处理。
本文将探讨程序设计中的错误处理与异常处理的重要性,并介绍一些常用的处理方法和技巧。
一、错误处理的重要性错误是指程序开发过程中产生的语法错误、逻辑错误等问题,它们可以在编译阶段被检测到,并且会导致程序无法正常运行或运行结果不符合预期。
错误处理是程序设计中必不可少的一部分,它有助于发现和纠正错误,提高程序的质量和稳定性。
首先,错误处理可以帮助开发者及时发现和解决问题。
当程序出现错误时,错误处理机制可以将错误信息打印出来,帮助开发者定位问题。
通过错误信息,开发者可以快速了解到错误发生的位置、原因和可能的解决方法,从而减少调试时间,提高开发效率。
其次,错误处理可以增强程序的容错性。
通过合理的错误处理机制,程序可以更好地适应不同的输入和环境变化。
当程序遇到异常情况时,错误处理可以优雅地处理并提供友好的用户提示,从而避免程序崩溃或不可用的情况发生。
这对于用户体验和系统稳定性至关重要。
最后,错误处理有助于提高程序的可维护性。
错误处理不仅能够快速发现和解决问题,还可以为后续的维护工作提供良好的支持。
通过记录和分析错误信息,开发者可以深入了解程序的运行情况和潜在问题,以便在后续的版本更新或功能扩展中做出相应的优化和改进。
二、异常处理的重要性异常是指程序在运行期间出现的不可预期的情况,如文件读写错误、网络连接中断等。
与错误不同,异常是可以被捕获和处理的,它不会导致程序的崩溃或终止。
异常处理是保证程序正常运行的重要手段,它可以将异常情况转化为可处理的状态,从而保证程序的稳定性和可靠性。
首先,异常处理可以防止程序的崩溃。
当程序遇到异常情况时,如果没有异常处理机制,程序很可能会直接终止,导致所有的操作和计算都无法完成。
尚硅谷_宋红康_第7章_异常处理

7.3 异常处理机制一
捕获异常的有关信息:
与其它对象一样,可以访问一个异常对象的成员变量或调用它的 方法。
getMessage() 获取异常信息,返回字符串 printStackTrace() 获取异常类名和异常信息,以及异常出
现在程序中的位置。返回值void。
异常名称
说明信息
堆栈信息
7.3 异常处理机制一
...... //当产生ExceptionName1型异常时的处置措施 } catch( ExceptionName2 e ){ ...... //当产生ExceptionName2型异常时的处置措施 } [ finally{ ...... //无论是否发生异常,都无条件执行的语句 }]
7.3 异常处理机制一
7.3 异常处理机制一
异常的抛出机制
为保证程序正常执行,代码必须对可能出现的异常进行处理。
7.3 异常处理机制一
如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处 理。如果异常没有在调用者方法中处理,它继续被抛给这个调用 方法的上层方法。这个过程将一直继续下去,直到异常被处理。 这一过程称为捕获(catch)异常。
finally语句和catch语句是任选的
7.3 异常处理机制一
7.3 异常处理机制一:举例
public class IndexOutExp { public static void main(String[] args) { String friends[] = { "lisa", "bily", "kessy" }; try { for (int i = 0; i < 5; i++) { System.out.println(friends[i]); } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("index err"); } System.out.println("\nthis is the end"); }
软件工程中的错误与异常处理

率。
容器化技术对错误处理的影响
灵活部署方式
带来了更加灵活和 可靠的部署方式
挑战
容器间通信和状态 管理带来了新的错
误处理挑战
云原生架构中的错误处理
弹性系统架构
提供了更加弹性和可扩展的系统架构
监控系统
通过云服务提供商的监控和日志系统,可以更好地处理系统错误和异常
系统中出现的错误和异常情况。
● 06
第六章 总结与展望
错误处理的重要性
在软件开发中,错误处理是至关重要的一环。合理的 错误处理可以提高软件的稳定性和用户体验,减少用 户的困惑和不良体验,是软件工程中必不可少的一部
分。
错误处理的好处
提高软件稳定性
提升软件质量
有效规避程序运行 中潜在的错误
减少bug的出现频 率
提高程序稳定性
异常分类
便于区分异常类型
Google Chrome浏览器的错 误提示
清晰的错误提示
帮助用户解决问题
扩展插件
调试网页错误
微软Windows操作系统的错误处理
错误报告
事件查看器
系统还原功能
帮助用户解决系统错误
提供错误定位信息
恢复到错误发生前状态
总结
错误处理是软件工程中的重要环节,各个软件及系统在错误处 理方面都有各自的最佳实践。通过学习案例分析,可以更好地 理解错误处理的必要性和实用性,提升软件开发质量和用户体
增强用户体验
避免用户面对不友 好的错误提示
简化调试过程
快速定位和解决问 题
自动化
错误处理将更加自动化 减少人为干预
软件测试中的异常处理和错误处理

软件测试中的异常处理和错误处理在软件测试中,异常处理和错误处理是非常重要的。
异常处理是指在程序运行过程中,当出现异常情况时,通过合理的处理方法使程序能够继续执行或提供相应的错误提示,以保证软件的正常运行。
错误处理则是指在程序开发过程中,通过适当的方法和技术来预防和修复已知的错误,以提高软件的质量和可靠性。
1. 异常处理在软件测试过程中,异常处理是必不可少的一环。
当程序发生意外情况时,正确处理异常可以保证软件的健壮性和稳定性。
常见的异常处理方法包括捕获异常、抛出异常和处理异常。
1.1 捕获异常捕获异常是指在代码中使用try-catch语句块来捕获可能发生的异常并进行处理。
当程序执行到try语句块时,程序会尝试执行其中的代码,如果发生异常,则会跳转到catch语句块进行处理。
通过捕获异常,可以避免程序的崩溃,并提供错误提示信息给用户。
1.2 抛出异常抛出异常是指在程序中主动抛出异常对象,通知调用者当前程序的异常状态。
通过抛出异常,可以追踪问题发生的位置,并将异常传递给调用者进行处理。
在软件测试中,我们可以通过模拟各种异常情况来测试系统的稳定性和鲁棒性,进一步提高软件的质量。
1.3 处理异常处理异常是指在捕获到异常后,进行相应的处理操作。
处理异常可以有多种方式,包括记录异常信息、回滚操作、重新尝试等。
根据具体的异常情况和业务需求,选择合适的处理方式,以保证程序在异常情况下正确执行。
2. 错误处理错误处理是指在软件开发过程中,通过合理的方法和技术来预防和修复已知的错误。
错误处理的目的是提高软件的质量和可靠性,减少因错误引起的系统崩溃和数据损失。
2.1 预防错误预防错误是最有效的错误处理方式之一。
在软件开发的早期阶段,我们可以通过合理的设计和开发规范来预防大部分的错误。
例如,采用模块化的设计思想,将复杂的系统拆分为多个相对独立的模块,减少模块之间的耦合性,提高系统的可维护性和可测试性。
2.2 引入自动化测试自动化测试是一种有效的错误处理方式。
软件测试中的异常处理与错误恢复

软件测试中的异常处理与错误恢复一、引言在软件开发过程中,异常和错误是无法避免的。
软件测试作为一种验证和确认软件符合特定要求的方法,异常处理和错误恢复是测试过程中至关重要的一部分。
本文将探讨软件测试中的异常处理和错误恢复的原则、方法和策略。
二、异常处理的原则1. 及时发现异常:在软件测试过程中,测试人员应该及时发现和捕获异常,避免异常在后续阶段造成更大的问题。
2. 合理记录异常:对于发现的异常情况,应该做好记录,并尽可能详细地描述异常发生的条件、环境和出现的具体现象,以便后续的错误恢复工作。
3. 分类和归纳异常:对于不同类型的异常,可以进行分类和归纳,有助于对异常进行更有效的处理和恢复。
4. 尽量减少异常发生的可能性:在软件测试的过程中,应该尽量减少异常发生的可能性,采取有效的预防措施,例如合理的输入检查和错误处理机制等。
三、异常处理的方法1. 异常捕获和记录:通过在程序代码中使用异常处理机制,可以捕获到特定类型的异常,并将异常信息记录下来,以便后续分析和修复。
2. 异常处理流程:定义一套统一的异常处理流程,包括异常的报告、跟踪和修复等环节,确保异常能够得到及时的处理和解决。
3. 异常回滚和恢复:对于发生异常的场景,采取适当的措施,例如回滚事务、还原数据等,以确保软件系统能够在异常情况下正常运行。
4. 异常信息反馈:在软件测试过程中,及时反馈异常信息给开发人员和其他相关人员,以便他们能够了解异常的具体情况,进行修复和优化。
四、错误恢复的策略1. 安全退出:当发生无法处理的致命错误时,应该采取安全退出的策略,以防止错误对系统造成更大的损害。
2. 自动恢复:对于一些可预见的错误,可以通过自动恢复的机制来修复错误,并使系统继续运行下去,以提高软件的稳定性和可靠性。
3. 数据备份和还原:在软件测试过程中,需要考虑数据的备份与还原策略,确保在错误发生时能够及时恢复数据,减少数据丢失和损坏的风险。
4. 异常处理流程的优化:通过对异常处理流程的分析和优化,可以减少错误恢复的时间和成本,提高软件的可维护性和可测试性。
软件工程中的错误处理与异常处理

软件工程中的错误处理与异常处理在软件开发的过程中,我们常常会遇到各种各样的错误和异常情况。
这些错误可能是由用户输入导致的,也可能是程序出现问题而引发的。
为了保证程序的稳定性和可靠性,我们需要对这些错误和异常进行处理。
一、错误处理的重要性错误处理是软件工程中至关重要的一环。
一个良好的错误处理机制可以有效地提高软件的可靠性和可维护性。
当程序出现错误时,正确的错误处理可以帮助我们快速定位和修复问题,从而减少系统故障的时间和影响范围。
二、错误处理的常见方式1. 异常捕获和处理异常是指程序执行过程中的非正常事件。
在软件开发中,我们可以通过捕获异常并进行处理来避免程序崩溃或产生不确定的结果。
异常处理可以分为两种方式:捕获异常和抛出异常。
捕获异常是指在可能发生异常的代码块中使用try-catch语句来捕获异常并进行处理。
通过捕获异常,我们可以在程序发生异常时执行一些特定的操作,例如输出错误信息、记录日志或者进行补救措施。
抛出异常是指在代码中遇到错误情况时,通过抛出异常来中断当前的执行流程并将错误信息传递给调用者。
通过抛出异常,我们可以将错误处理的责任交给调用者,从而实现代码的模块化和复用。
2. 返回值和错误码除了使用异常处理外,我们还可以通过返回值和错误码的方式来处理错误。
在函数或方法中,我们可以定义一个返回值或错误码来表示函数执行的结果。
通过对返回值或错误码进行判断,我们可以根据不同的情况执行相应的处理逻辑。
返回值和错误码的方式相对于异常处理来说,更加灵活和直观。
但是在实践中,我们需要谨慎使用返回值和错误码,因为过多的判断语句会增加代码的复杂度和难以维护性。
三、异常处理的最佳实践1. 在适当的层次进行异常处理异常处理应该在合适的层次进行,不同的异常应该由不同的层次进行处理。
一般来说,业务层应该捕获并处理业务相关的异常,而更底层的模块或组件应该将异常抛给调用者,由调用者来决定如何处理异常。
2. 提供有意义的错误信息当发生异常时,我们应该提供有意义的错误信息来帮助调试和定位问题。
第7章 调试、测试和异常处理PPT教学课件
• 每一个应用程序开发出来,交给客户使用前都要进行检查, 确保其没有错误并且安全可靠,才能交付使用。任何软件 都不能保证完全没有错误,程序员应尽力去发现其中的错 误并修正这些错误。发现并消除错误的过程就是调试。如 果程序调试通过,就要检测该软件是否符合用户需求,软 件中是否包含未发现的错误,这个过程成为测试。在编写 程序过程中,有些错误是可以预测到的,有些是预测不到 的,对于可预测的错误C#提供了异常处理机制,保证程序 的正确性和可靠性。本章将详细讨论C#中的调试、测试和 异常处理方法。主要内容如下:
• 这个例子中,感冒就是一个异常,因为预先考虑 到可能出现的问题,进行了合适的处理,这就是 异常处理。适当的异常处理可以避免系统终止当 前操作,程序不会出现故障,系统也不会崩溃。
7.3.2 异常类
• .NET提供了大量与异常有关的类,用来处理异常, 每一个异常类都表示一种异常,Exception类是所 有异常的基类。异常类继承关系的结构图如图7.8 所示。
• 在消除了程序中的语法错误和运行时错误后,程序依旧不 能保证完全正确,程序员可以自己进行简单的单元测试, 来确定基本功能是否完善,复杂的测试有专业测试人员进 行。什么是单元测试呢?
• 单元测试是测试隔离的单元或模块,对各种方法分别使用 不同的输入和执行参数来测试。单元测试的依据是详细设 计描述,单元测试应对模块内所有重要的控制路径设计测 试用例,以便发现模块内部的错误。单元测试多采用白盒 测试技术,系统内多个模块可以并行地进行测试。VS2008 将单元测试工具集成在IDE中,方便程序员的使用,下面通 过一个简单的例子来说明VS2008中单元测试工具的使用。
7.3 异常处理
• 利用调试和测试,可以有效地减少程序中的错误, 但是程序中的错误是不可避免的,就像人难免会 生病一样。错误是客观存在的,程序员有责任和 义务尽量减少错误的发生。面对不可避免的、可 能出现的错误,如何积极面对,以保证程序的稳 定可靠,具有非常重要的意义。
如何处理异常和错误
如何处理异常和错误在我们的日常生活中,很难避免遇到异常和错误。
无论是在工作中,还是在生活中,处理异常和错误的能力是一项非常重要的技能,它决定了您的工作效率和个人形象。
在这篇文章中,我们将讨论如何处理异常和错误,并提供一些实用的建议,以帮助您更好地应对这些挑战。
一、认识异常和错误在开始探讨处理异常和错误的方法之前,我们需要理解什么是异常和错误。
简单来说,异常是指程序中发生的意外情况,而错误是指程序无法执行或返回正确结果的情形。
异常和错误都需要我们去解决,否则它们会影响我们的工作效率,甚至会给我们带来心理压力。
因此,我们需要了解如何正确识别和处理它们。
二、正确识别异常和错误在识别异常和错误时,我们需要学会观察、分析和判断。
观察是指仔细观察发生异常或错误的情况,比如程序报错、电脑死机等。
分析是指评估异常或错误的情况,确定问题的根本原因。
判断是指在评估情况之后,决定该如何处理这个问题。
在进行观察、分析和判断时,我们需要考虑以下几个因素:1.异常或错误的类型:在一些情况下,我们需要更加深入地了解异常或错误的类型,以便更好地处理它们。
比如,如果您在编写代码时发现某个 SQL 查询出现了错误,您需要仔细检查数据库连接,查看日志文件等,以确定错误的类型和原因。
2.影响范围:当我们遇到异常或错误时,需要评估问题的影响范围。
如果问题只是局部影响,我们可以采取相应的措施来处理它;如果问题的影响非常广泛,我们需要更加积极地解决它。
3.时间限制:处理异常或错误的时间限制也是需要考虑的因素。
如果时间紧迫,我们需要通过一些简单的方法来快速解决问题,以确保工作的正常进行。
三、处理异常和错误的技巧在认识异常和错误、识别问题之后,我们需要掌握一些实用的技巧来处理它们,以便更好地解决问题。
1.维护清晰的日志记录在遇到异常或错误时,记录日志是至关重要的。
通过记录日志,我们可以更好地了解每个问题的发生时间、原因和影响范围,并且更好地监控系统的运行状况。
异常处理和错误处理的策略和实践
异常处理和错误处理的策略和实践异常处理和错误处理是软件开发过程中重要的一部分,它们能够帮助我们准确地识别和解决潜在的问题,提高系统的健壮性和可靠性。
本文将探讨异常处理和错误处理的策略和实践,并介绍一些常见的方法和技巧。
一、异常处理和错误处理的概念和原则异常处理和错误处理是编程中的常见问题,但是它们并不是同一回事。
异常是一种潜在的问题,它可能会导致程序的中断或异常状态,例如除零错误、空指针引用等。
而错误是实际发生的问题,导致程序无法正常执行或输出错误结果。
异常处理和错误处理的目标是相同的,即通过识别问题、定位问题、解决问题,提高系统的可靠性和健壮性。
在进行异常处理和错误处理时,应遵循以下几个原则:1.即时发现并处理错误:在编写代码时,应预判可能出现的错误,并在发现错误时立即进行处理,而不是将错误留待后续处理。
这样可以尽早找到问题的根源,减少后续的调试和修改工作量。
2.明确异常处理策略:在编写代码时,应明确异常处理的策略和流程。
不同的异常可能需要不同的处理方式,例如抛出异常、返回错误码、记录错误日志等。
明确的异常处理策略可以减少不必要的错误处理和判断,提高代码的可读性和可维护性。
3.细化异常类型和信息:在抛出异常时,应尽量细化异常的类型和信息,以便快速定位问题的根源。
通常,异常应包含足够的上下文信息,例如异常发生的位置、异常的原因、异常所涉及的输入数据等。
这些信息可以帮助我们快速定位和解决问题。
4.处理异常时保持系统的稳定性:在处理异常时,应尽量保持系统的稳定性和可用性。
异常处理代码应尽量避免引入新的异常或错误,应尽量在处理异常后返回到系统的正常状态。
如果异常无法立即解决,应采取适当的恢复措施,例如回滚事务、重新尝试操作等。
二、异常处理的方法和技巧异常处理是一种常见的错误处理和调试手段,在实际开发中经常会遇到各种异常处理的情况。
下面介绍一些常见的异常处理方法和技巧:1.使用try-catch语句块:try-catch语句块是一种常见的异常处理方法,可以捕获和处理特定类型的异常。
软件开发中的错误处理与异常处理
软件开发中的错误处理与异常处理在软件开发过程中,错误和异常处理是非常重要的一部分,它们可以帮助我们更好地提高软件的稳定性和可靠性。
本文将探讨软件开发中的错误处理和异常处理的重要性,并介绍一些常见的错误处理和异常处理策略。
一、错误处理的重要性在软件开发过程中,错误是难以避免的。
无论是人为错误还是系统错误,它们都有可能导致软件崩溃、功能异常甚至数据丢失。
因此,合理的错误处理机制可以确保程序在面临错误时能够正确、快速地做出响应,从而保证软件的稳定性和可靠性。
二、错误处理的策略1. 异常捕获:使用 try-catch 块来捕获可能出现的异常,并在 catch块中处理异常信息。
异常捕获可以避免程序因为异常而崩溃,并通过处理异常信息来提醒用户或者进行相应的修复措施。
2. 日志记录:将错误信息记录到日志文件中,以便开发人员能够及时了解出现的错误情况并进行排查。
日志记录可以提供有价值的信息,以帮助开发人员分析和解决问题。
3. 异常传递:当无法处理某个异常时,将异常传递给上层调用者来处理。
通过异常传递,可以将处理异常的责任交给更高层次的代码,以便针对不同的异常情况采取相应的处理策略。
4. 用户提示:向用户提供友好的错误提示信息,以帮助用户快速定位问题并采取正确的操作。
用户提示信息应该简明扼要,避免过于技术化,以便用户能够轻松理解错误的原因和解决方法。
三、异常处理的重要性在软件开发过程中,异常处理是处理错误的一种重要方式。
异常是指在程序执行过程中出现的非预期情况,例如除零错误、内存溢出等。
合理的异常处理可以避免软件崩溃、提高程序的健壮性和容错性。
四、异常处理的策略1. 异常类型定义:根据不同的异常类型,定义相应的异常类,以便更好地区分和处理不同的异常情况。
2. 异常抛出:当出现异常情况时,使用 throw 关键字将异常抛出,并在调用栈中寻找合适的异常处理器来处理异常。
通过异常抛出,可以将异常信息传递给相应的异常处理器,从而进行相应的处理逻辑。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static void Main(string[] args) { int i=division(100, 3); if (i > 0) { Console.WriteLine("除法运算成功,结果为{0}", i); 142
·143· } else { Console.WriteLine("除法运算失败!"); } Console.ReadLine(); } static int division(int x, int y) { if (y == 0) { return -1; } else { decimal d = x / y; return (int)d; } }
表 7.1 .NET预定义的异常类 异常类 System.ArgumentException System.ArgumentNullException System.ArgumentOutOfRangeException 描述 表示当方法中的参数无效时引发该异常。 ArgumentNullException:表示向不接受null的参数传递一个null值时, 引发异常 ArgumentOutOfRangeException: 表示向参数传递超出指定的范围的值 时,将引发该异常。 如果试图访问或者是读写受保护内存时引发的异常。 在运算、类型转换或转换操作中的错误而引发的异常。 DivideByZeroException:被零除时引发异常。 NotFiniteNumberException:当浮点数为正无穷大、负无穷大或非数字 (NaN) 时引发的异常。 OverflowException:在算术运算、类型转换或者是转换操作导致溢出 时引发的异常 如果使用集合中不存在的键来从该集合检索元素时 表示使用 组件发生错误时引发的异常。 ConstraintException:表示在尝试执行违反约束的操作时引发的异常。 InvalidConstraintException:表示在不正确地尝试创建或访问关系时引 发的异常。 MissingPrimaryKeyException: 表示在尝试访问没有主键的表中的行时 引发的异常。 ReadOnlyException:表示在尝试更改只读列的值时引发的异常。 发生 I/O 错误时引发的异常。 DirectoryNotFoundException:表示找不到文件或目录时所引发的异 常。 DriveNotFoundException: 表示访问的驱动器或共享不可用时引发的异 常。 EndOfStreamException:表示读操作试图超出流的末尾时引发的异常。 FileLoadException:表示找到托管程序集却不能加载它时引发 FileNotFoundException:表示访问磁盘上不存在的文件失败时引发
图 7.1
编译时捕捉到异常,弹出一个 Exception 窗口
图 7.2
运行时捕捉到异常
示例程序中,通过在 try 块定义要执行的语句。在 catch 块中捕捉可能出现的异常,并使用 throw 语 句显示抛出了一个异常。在示例程序中,定义了两个 catch 块。在.NET 中,可以定义多个 catch 块,但 只能有一个 try 块。 示例代码的第一个 catch 块中,使用了 DivideByZeroException 异常。这个异常是一个具体异常。他 所代表的就是被 0 除的错误,第二个 catch 块中的异常类通常称为基类异常,该异常具有比第一个异常 更粗的粒度,在这个示例中是 Exception 类型,Exception 类型是所有异常类的基类。
上面的示例代码中,通过使用 try/catch 语句块,封装了在运行除法运算中可能会引发的错误,如果 在为被除数赋一个 0 值, 在编译时将会编译不过, debug 模式下 Visual studio2005 将会产生如图 7.1 所示
143
·144·
的错误。如果直接运行程序,在控制台窗口将会产生如图 7.2 所示的输出。
System.AccessViolationException System.ArithmeticException System.DivideByZeroException System.NotFiniteNumberException System.OverflowException
7.2
finally 块
不论是否捕捉到异常,finally 块中的代码一定会执行。举个例子,在处理文件时,如果打开了一个 文件,执行一些写入操作,这时候发生了致命错误,由于 catch 块捕捉到异常后,控制权会直接跳转到 异常处理结尾,那么这时候这个打开的文件一直没有被关闭。显然这会造成资源占用,如果文件是以独 占的方式被打开的话,其他操作将无法顺利进行。另外一个比较常见的例子是数据库操作,如果正在执 行一个行级锁定更新时,发生了异常,那么这会导致这个锁一直不能被释放,继而影响到其余的步骤无 法顺利进行。 使用 finally 块可以清除 try 中分配的任何资源, 以及运行任何即使在发生异常时也必须执行的代码。 代码控制权最终总是传递给 finally 块,与 try 块的退出方式无关。因此,finally 块提供了一种保证资源 清理或者是资源恢复的机制。 下面的示例程序代码演示了在执行一个文件读写操作的时候,不论是否发生异常,最终都关闭文件 流。关于文件处理的章节读者可参考第 11 章。
7.1
try/catch 块
在开发应用程序时,可以假定任何代码块都可能引发异常,特别是 CLR 运行库本身可能引发异常。 比如 OutOfMemoryException、StackOverflowExcpetion 异常。在一些情况下,可能会使用 if 语句检测可 能会引发异常的条件。比如一个除法运算,在执行前检测被除数是否为一个不是 0 的数值,如果是则提 示用户除法运算失败。如下面所示的示例代码。
程序输出窗口如图 7.5 所示。图 Βιβλιοθήκη .5产生异常后的程序输出窗口
从输出窗口可以看到,不论是否发生了异常,程序都执行了 finally 块中的代码。
7.3
预定义异常的类
在讨论 catch 语句块时, 提到过两个异常类: DivideByZeroException 和 Exception 类。 System.Exception 是 DivideByZeroException 的基类,也是所有其他异常类的基类。 在 System.Exception 基类之后,又分了两种类型的异常: 从 SystemException 派生的预定义 CLR 异常类。
145
·146·
从 ApplicationException 派生的用户定义的应用程序异常类。 如果要定义自己的异常类或者建立自定义的异常体系,需要从 ApplcationException 类中派生。 SystemException 类中的异常是 CLR 预定义的异常类。 表 7.1 对 SystemException 中比较常用类进行了介绍,更多的异常类信息可以参考.NET 中的文档。
try { //try 块 //在这一区块中放置需要被执行的程序代码。 } catch(exception ex) { //catch 块 //exception 表示异常处理器,可以为系统缺省的异常处理器,也可以是用户自定义的异常处理器 } catch(customexception ex) { //catch 块 //exception 表示异常处理器,可以为系统缺省的异常处理器,也可以是用户自定义的异常处理器 } finally { //finally 块 //它在每次块退出时都执行,不论退出是由正常控制流引起的还是由未处理的异常引起的。 }
·142·
第7章
处理异常和错误
异常是指应用程序运行时遇到的错误或程序意外的行为。如,在运算中除以 0 的操作,调用代码或 程序代码中有错误,操作系统资源不可用等等。异常处理则是在应用程序发生异常情况时,采取什么样 的操作,是继续程序的执行,还是中断用户的操作。 为了捕捉和处理异常,C#提供了 3 个关键字:try、catch 和 finally。try 后面紧跟需要执行的代码块, 这称为一个 try 块。catch 捕捉 try 代码块中可能发生的异常,并调用合适的异常处理器进行异常的处理, 称之为 catch 块,finally 是不管异常是否被处理都必须执行的代码块,称为 finally 块。 一个典型的异常处理结构为:
·145· fs.Flush(); //将流指针移到开头。 fs.Seek(0, SeekOrigin.Begin); byte[] bytes2 = new byte[bytes.Length]; fs.Read(bytes2, 0, bytes.Length); string str = Encoding.Default.GetString(bytes2); Console.WriteLine("从文件中读出的字符串为" + Environment.NewLine+str); } catch (IOException ex) { Console.WriteLine("发生了文件处理的错误!" + ex.Message); } finally { Console.WriteLine("不论是否发生异常,都会执行 finally 到这里"); if (fs != null) { fs.Close(); } Console.ReadLine(); } }