BCB讲座第十三讲异常处理
第十二章 异常处理

-15-
13:53
int main(){ try{ int x,y,z; x=8;y=4; z=testException(x,y); cout<<x<<'/'<<y<<'='<<z<<endl; x=123;y=0; z=testException(x,y); cout<<x<<'/'<<y<<'='<<z<<endl; x=8;y=0; z=testException(x,y); cout<<x<<'/'<<y<<'='<<z<<endl; } catch(out_of_range &e1) { cout<<"exception:"<<e1.what()<<endl; } catch(doma<"exception:"<<e2.what()<<endl; } return 0; -16-
-14-
13:53
#include <iostream> #include <stdexcept> using namespace std; int testException(int i,int j) throw(out_of_range,domain_error) { if(i<0||i>100) throw out_of_range("parameter is out of range!"); if(j==0) throw domain_error("divided zero!"); return i/j; }
第十二讲异常处理

程序中的异常
我们来完成一个简单的加法器:从控制台输入两个数字, 程序计算出这两个数字的和,看看会不会出现异常:
public class Addition {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
无异常
finally 块
专业 专注 创新 共赢
try-catch-finally块
try-catch-finally块代码示例:
public class Addition3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请录入两个数:");
try {
double num1 = input.nextDouble();
double num2 = input.nextDouble();
double result = num1 + num2;
System.out.println("两个数的和是:" + result);
欢迎使用! 异常堆栈段信息
专业 专注 创新 共赢
try-catch块
在try-catch块中,try语句块中代码执行时会发生以 下3种情况之一:
第三种情况:
try语句块中代码执行 过程中产生异常,
但是抛出的异常并没有 在catch语句块中声明,
那么这个时候程序 会立刻终止。
引发
异常
try
第12章 异常处理

注意:将对应派生类类型的处理代码放在 对应基类类型的处理代码之前
11
2、C++语言中的异常处理(续)
捕 获 所 有 异 常
使用异常声明为省略号的catch子句
catch(...) { //… }
省略号表示与任意异常类型均可匹配 注意:如果try块中还有其他catch子 句,则catch(...)子句必须放在最后
20
auto_ptr
2、C++语言中的异常处理(续)
主要操作
类
构造函数 析构函数 *与-> = Reset、release、get
auto_ptr
21
#include <iostream> #include <memory> #include <string> using namespace std;
6
class MyException { public: MyException(const std::string msg = "") : message(msg) {}
例 1 : 参 数 异 常 的 处 理
std::string what() { return message;
private: std::string message; };
C++语言程序设计
第12章 异常处理
中山大学信息科学与技术学院
主要内容
异常处理概述 C++语言中的异常处理
异常的抛出 异常的捕获及处理 标准库异常类 异常说明
2
1、异常处理概述
23异常处理

1、异常处理的基本概念 2、异常处理的实现
23.1 异常处理的基本概念 ► 1. 为什么要异常处理 ► 在设计各种软件系统中,处理程序中的错误和其它反常行为是非常 困难的,比如服务器上长期运行的网络服务程序将80%的代码用于 实现错误检测和错误处理。
3
23.1 异常处理的基本概念
► 异常是指程序运行时出现的不正常。程序运行过程中可能会出现下 列异常:
► 其中throw不加表达式,表示再次抛出try块中检测到的异常表达式 (throw “hello”)。
► 重抛异常不能被try-catch捕获,只能传到上一级函数。
15
1 2
20
23.2 异常处理的实现
【例23.1】异常处理举例。
1 #include <iostream>
2 using namespace std;
3void fun(int test)
4{
5
if(test==0) throw test; //抛出int型异常
6
if(test==1) throw 1.5; //抛出double型异常
if(test==0) throw test; //抛出int型异常 if(test==1) throw 'a'; //抛出char型异常 if(test==2) throw 333.23; //抛出double型异常
1
23.2 异常处理的实现
► 关于throw的说明: ► (1)执行throw的时候,不会执行跟在throw后面的语句,而是将 程序从throw转移到匹配的catch,该catch可以是同一函数中的 catch,也可以在直接或间接调用发生异常函数的上一级函数中。 ► (2)被抛出的对象是一个用throw表达式初始化的“异常对象” 异常对象由throw创建,并初始化为被抛出的表达式副本。异常对 象 将传递给对应的catch,并在异常处理完成后撤销。因此异常对 象 必须是可以复制的类型(具有复制构造函数)。
异常处理与跟踪调试

第14章异常处理与跟踪调试第一讲异常处理与跟踪调试教学目标1. 了解异常处理的定义和作用。
2. 理解异常处理捕获和消除的方法3. 了解异常处理的抛出和跟踪调试。
教学过程预备知识一、异常处理C#提供了处理错误的机制,即使用异常类Exception为每种错误提供定制的处理,并把识别错误的代码和处理错误的代码分离开来。
1.try…catch捕获异常正常情况下,程序流进入try控制块,如果没有错误发生,就会正常操作。
当程序流离开try控制块后,如果没有发生错误,将执行catch后的finally语句块或顺序执行;当执行try时发生错误,程序流就会跳转到相应的catch语句块。
例题:在TextBox控件中接受两个数,计算它们的商。
2.try…finally清除异常如果关心的是清除异常而不是错误处理,可以使用try…finally清除异常来实现。
它不仅抑制了出错消息,而且所有包含在finally块中的代码在异常被引发后仍然会被执行。
3. 用try…catch…finally处理所有的异常应用程序最有可能的途径是合并前面两种错误处理技术——捕获错误、清除并继续执行应用程序。
所有要做的是在出错处理代码中使用try-catch-finally语句。
4.抛出异常当你必须捕获异常时,其他人首先必须首先能够引发异常。
而且,不仅其他人能够引发,你也可以负责引发。
throw方法用于引发一个异常,当使用该方法时,可以对方法调用时出现的异常进行描述。
如程序中使用下列语句:throw new DivideByZeroException("除数不能为0!");则在引发DivideByZeroException异常时显示“除数不能为0!”的信息。
5.常用的异常类6.用户自定义异常除了预定义的异常外,还可以通过继承Exception创建自己的异常类。
声明一个异常,格式如下:class ExceptionName:Exception{}引发自己的异常的格式如下:throw(ExceptionName);二、14.2 跟踪和调试C#中提供对程序编译的两种辅助手段,用于检查或发现程序中的错误,跟踪和调试。
异常处理流程PPT课件( 24页)

• 按排QE人員至客戶端復判,若不良按排人員sorting客戶端的 庫存;(須依據不良D/C,單一SKU進行sorting )
• 三.不良品廠內分析
• QE/PE——復判分析不良品; • QE——根據分析結果進行處理。
一.接到客訴反應
掌握時效 a.先與客戶確定問題 b.處理時間確認 c.人力安排
2 客訴異常處理流程
客戶端製程問題
告知SQE此問題Heisei不會造成此問題的發生。
2 客訴異常處理流程
HEISEI製程漏失問題
1.安排人員進行重工客戶端的庫存及厰内的庫存; 2.清查客戶端及廠內庫存回報主管 ; 3.如須重工須與PE確認重工手法、重工批量與物料確認待重工 數量; 4.如須重工須與PE確認重工手法、重工批量與物料確認待重工 數量; 5.如需安排人員外出重工﹐須安排車輛接送重工人員; 6.每日重工結果須填寫Sorting單回報給主管.
•
14、给自己一份坚强,擦干眼泪;给自己一份自信,不卑不亢;给自己一份洒脱,悠然前行。轻轻品,静静藏。为了看阳光,我来到这世上;为了与阳光同行,我笑对忧伤。
•
15、总不能流血就喊痛,怕黑就开灯,想念就联系,疲惫就放空,被孤立就讨好,脆弱就想家,不要被现在而蒙蔽双眼,终究是要长大,最漆黑的那段路终要自己走完。
召集所有相關單位進行開會 (目的預防後期再發生同樣的問題)。
2 客訴異常處理流程
原材材料問題 要求廠商人員進行重工客戶端的庫存及厰
内的庫存,並提出後續的改善措施及改善後 的標示。
要求PE製作管控圖片發于相關部門,並進 行協助廠商管控。
The End
•
5、世上最美好的事是:我已经长大,父母还未老;我有能力报答,父母仍然健康。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
异常处理 在程序设计过程中,我们不仅仅要考虑如何实现程序的功能,还要防止可能出现的异常情况,所谓异常情况就是指在程序运行过程中出现的不正常或不可预料的情况,例如打开的文件不存在、不能分配所需的内存等等。特别是当一个软件要面向大量用户时,它所遇到的运行情况可能千差万别,如果不能够应付各种异常情况,其功能再好再强大也难以弥被这样的缺陷。本讲要介绍的就是如何在CBuilder中实现异常处理,并为Mp3Collect添加异常处理代码。 传统的异常处理方法 为了应付可能出现的不正常情况,传统的方法主要是通过条件判断语句来检查是否产生异常的事件。例如,在MP3Collect程序的SaveFile函数中,我们添加了如下的条件语句,以处理可能产生的打开文件错误: if(fp==NULL) { ShowMessage("不能打开文件Mp3Collect.sav,请检查是否为共享冲突"); return; } 在检测到了异常事件后,一般需要做两件事,一是显示错误的信息,例如以上代码中对ShowMessage()函数的调用,再一个就是中断程序原有的执行流程,因为异常的发生已经使得程序无法满足继续执行原有流程的条件,在SaveFile()函数中,如果文件打开失败,就不能继续后面的写文件操作,因此在异常处理中用return语句直接返回,中断了保存文件的操作。 这种异常处理的方法当然最容易理解,但在大型的软件开发项目中,需要考虑的异常情况非常多,如果每个地方都使用if语句来检查错误并处理异常,就会使编程工作变得非常繁杂,源代码的可读性也会大大降低。为了解决这一问题,人们在面向对象编程中找到了更加结构化和更简便的方法来实现异常处理。 CBuilder中的异常处理机制 CBuilder支持多种异常处理机制,其中包括符合ANSI标准的C++异常处理机制,微软公司提供的Win32结构化异常处理机制,以及基于VCL的异常处理机制,后者是Borland公司建议在CBuilder编程中采用的异常处理方式。 基于VCL的典型异常处理结构的形式如下所示: try{ //可能引起异常的代码段 } catch(Exception &e){ //对异常进行处理的代码 } 其中try和catch为C++关键字。try用于标志可能产生异常的代码段(Block),该代码段用try后紧跟的一对大括号{}包括在内。如果这段程序在运行时产生了异常,系统会中止try代码段中的代码执行,并查找相应的catch代码段,如果找到了合适的catch代码段,即表示错误被捕捉到,这时相应的catch代码段被执行,如果没有找到合适的catch代码段,即错误始终没有被捕捉到,则系统会调用VCL库按照缺省的方法来处理异常。当然,如果try代码段在运行时一切正常,则catch代码段是不会被调用的。 在上面的异常处理结构中,我们看到,catch语句带有一个参数Exception &e,该参数是一个异常对象的引用。其中Exception是VCL库提供的异常处理类,该类代表了VCL库对异常事件的一个封装。也许有的朋友要问,catch语句中的Exception &e对象是哪里来的呢?整个程序代码中没有该对象的声明或定义呀?这正是VCL异常处理机制的特点,当异常产生时,VCL库会自动生成该异常对象,并将其作为参数调用合适的catch代码段。 Exception类也是其它VCL异常处理类的基类。为了处理不同的异常原因,CBuilder提供了多种异常处理类,例如,代表申请内存失败的EOutOfMemory异常,代表除数为0的EDivByZero异常,代表文件打开错误的EFOpenError,代表数据库操作错误的EDatabaseError,以及代表多媒体操作错误的EMCIDeviceError等。 事实上,一个代码块可能产生不止一种类型的错误,这样,对一个try代码段可以采用多个catch代码段。例如,一个try代码段内部可能产生申请内存失败异常EOutOfMemory和打开文件错误EFOpenError,那么我们可以使用两个catch语句来分别监视两种异常情况。采用多个catch语句的优点在于,可以对不同类型的异常分别进行捕捉和处理,但有时即使使用了多个catch语句后仍无法保证能够捕捉到所有的异常,这时可以使用参数为省略号(...)的通用catch语句,它可以捕捉尚未捕捉的所有任意类型的异常。 下面是使用多个catch及通用catch语句的典型例子,try代码段中进行了打开文件操作、分配内存操作、文件读操作和整数除法操作,这些操作都有可能引起异常,程序中对打开文件异常和分配内存异常分别进行了处理,对剩下的异常则统一由catch(...)语句进行处理。 try{ FILE * fp=fopen("test.dat","rb");//可能出现EFOpenError类异常 BYTE * buf=new BYTE[1024];//可能出现EOutOfMemory类异常 int k,i=100,j=fread(buf,1024,1,fp);// 可能出现EReadError类异常 k=i/j; //可能出现EDivByZero类异常 fclose(fp); delete buf; } catch(EFOpenError &e){ ShowMessage("test.dat:打开文件错误"); } catch(EOutOfMemory &e){ ShowMessage("内存不足错误"); } catch(...){ ShowMessage("应用程序出现异常错误"); } CBuilder为VCL库提供了非常灵活的异常唤醒和异常处理机制,除了由VCL库检测和产生异常之外,还可以由程序通过throw语句来强制产生一个异常,例如下面的代码在检测到异常情况后,强制产生一个异常,并初始化异常消息,交由catch代码段进行处理,后者将显示出现异常的信息。在这段代码中,异常检测仍然采用的是传统的条件语句检测方法,但异常处理则采用的是面向对象的异常处理方式。 try{ FILE * fp=fopen("test.dat","rb"); if(fp==NULL) //检测异常条件 throw Exception("test.dat:打开文件错误"); //创建异常对象,并抛出异常对象 ...//正常的执行代码 } catch(Exception &e){ ShowMessage(e.Message);//显示异常信息 } 为MP3Collect程序添加异常处理功能 了解了有关CBuilder中异常处理的基础知识后,下面我们就来为Mp3Collect添加异常处理代码,以提高程序的容错性和强壮性。 实际上,由CBuilder自动生成的程序框架中已经包含了异常处理代码,在应用程序入口单元文件MP3Collect.cpp中,入口函数WinMain()便包含有try和catch代码段。不过,仅仅依靠这些缺省的异常处理还不够,我们还需要针对不同的错误情况分别进行处理,才能保证程序运行的可靠性。 在Mp3Collect中,可能出现的异常情况主要是由媒体播放器控件产生的EMCIDeviceError和进行文件操作时产生的各种文件操作异常,具体地说,可能产生异常的函数主要有btnShowAllClick()、btnFindClick()、SaveFile()、btnFileNameClick()、mnuAddClick()、ListView1SelectItem()、MediaPlayer1Click()、Timer1Timer()、PlayTheSong()等。不过,为了简化程序代码,心铃准备统一采用了Exception类来捕捉所有的VCL异常对象,并利用对象的类名称属性ClassName来显示该异常的类别。 BtnFileNameClick()的主要功能是运行打开文件对话框OpenDialog1,并将获取的文件名赋给文件名称编辑框和媒体播放器,其中,从OpenDialog1->Execute()开始就可能产生异常,下面是添加了异常处理后的btnFileNameClick(): void __fastcall TMainForm::btnFileNameClick(TObject *Sender) { try{//标志可能产生异常的代码段 if(OpenDialog1->Execute()) { MediaPlayer1->FileName=OpenDialog1->FileName; edtFileName->Text=OpenDialog1->FileName; edtSongName->Text=ChangeFileExt(ExtractFileName(OpenDialog1->FileName),""); edtSingerName->Text=""; MediaPlayer1->Open(); } } catch(Exception &e){//异常信息由两部分组成:异常对象的类名称、异常对象的错误消息 ShowMessage(AnsiString(e.ClassName())+ ": " + e.Message); } } mnuAddClick()与btnFileNameClick()相似,此处不再重复。 ListView1SelectItem()在操作MediaPlayer1控件时容易产生异常,因此try代码段中应包括对MediaPlayer1的操作,添加异常处理后的该函数如下: void __fastcall TMainForm::ListView1SelectItem(TObject *Sender, TListItem *Item, bool Selected) { if(Item && Selected) { ……//其它操作 try{//try代码段包括对MediaPlayer1的操作 MediaPlayer1->FileName=edtFileName->Text; MediaPlayer1->Open();