用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

第51讲

上次修改时间: 2023-09-09 19:46:49      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\小甲鱼Delphi\      下一页

第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个命令