

第51讲
1. 当函数A调用B,B中又调用C时,一般只需要A中加入异常处理语句,里抽的B和C出异常会跳到A的异常处理语句
2. delphi异常继承自操作系统的异常
3. delphi中所有异常类都是Exception的子类,大致可分为运行库异常,对象异常,组件异常,也可以从Exception派生一个自定义的异常类
4. Try..end间的代码为保护块,当保护块的代码出错,程序自动创建一个异常类exception,程序可捕获并处理这个异常类,以确保程序正常结束和释放资源。
//注:如果程序未处理异常,当发生异常时,系统就会弹出一个错误信息的消息框
5. try...except语句,只有发生异常才会执行except分部的代码,可以在except部分加on..do对不同异常做不同的处理
1)基本语法:
try
..保护块代码
except
...异常处理语句,不发生异常,不执行这时语句
end;
2)在Except部分加on...do语句语句与示例:
A.语法:
try
..保护块代码
except
on 异常类型1 do 语句1 //对指定异常进行处理
on 异常类型N do 语句N
else
语句N
end;
B.示例:
try
b:= StrToFloat(edit1.Text);
c:= StrToFloat(edit2.Text);
a:= b /c;
Edit3.Text:= FloatToStr(a);
except
on Ezerodivide do Edit3.Text:='不能用 0 除'; //这里的Ezerodivide为异常类型,可以去查表,继承自操作系统
on EMathError do Edit3.Text:='计算错误';
else
Edit3.Text:='发生异常';
end;
6. Try...finally语句,发不发生异常都会执行Finally下语句,主要是确保分配的资源得到回收,防止类似内存泄漏这些情况发生
例1:下面第三行如发生异常,将不会执行第4次内存回收语句,就会造成内存泄漏
n:= 0;
GetMem(pPointer, 1024); //分配 1KB 的内存
m:= 10 div n; //这里将触发被零除的异常
FreeMem(pPointer, 1024); //永远执行不到这里
例2:将例1的将上try..finally的异常处理语句,程序就不会造成内存泄漏了
n:= 0;
GetMem(pPointer, 1024); //分配 1KB 的内存
try
m:= 10 div n; //这里将触发被零除的异常
finally
FreeMem(pPointer, 1024); // 必须被执行
end;
7. try..except与try..finally的区别
1)前者只有发生异常才会执行except部分代码,后者无论是否发生异常都会执行finally部分代码
2)前者执行了except部分代码后异常被释放,后者执行finally代码处理异常后异常仍然存在
3)finally不能用on..do对不同的异常类型做不同的处理,只能是finally做笼统的处理
4)try..finally的try中用了exit,break,continue后流程会提前跳到finally部分,而finally部分不能调用这3个命令