异常处理与调试2
让编程改变世界
Change the world by program
Delphi 异常类
利用异常机制,就是允许写代码时可以假设:如果用户可以得到子程序调用或计算的结果,这些结果一定是有效的。 如果你在写程序的时候发现自己在为几乎每个单独的语句编写异常处理程序,那么说明还没有掌握要点。 如果你在阅读经典代码时经常考虑“如果执行到这里,那么在此之前的每件事情都一定已经运行得很好了!”那么就说明已经掌握了正确的概念。 异常类是Delphi异常处理机制的核心,也是Delphi异常处理的主要特色。 Delphi提供的所有异常类都是Exception类的子类。用户也可以从Exception类派生一个自定义的异常类。 Delphi 提供了一个很庞大的异常类体系,这些异常类几乎涉及到编程的各个方面。 从大的方面可以把异常类分为运行库异常、对象异常、组件异常 3 类。下面介绍它们中常用的异常类!异常的基本语法结构
Delphi异常处理机制建立在保护块(Protected Blocks)的概念上。 所谓保护块是用保留字try和end封装的一段代码称为保护块,保护块的作用是当应用程序发生错误时自动创建一个相应的异常类(Exception)。 程序可以捕获并处理这个异常类,以确保程序的正常结束以及资源的释放和数据不受破坏。 当然如果程序不进行处理,则系统会自动提供一个消息框。异常响应与 try…except 语句
try…except语句的一般格式如下: [codesyntax lang="delphi"]try //try 保护代码块 被保护语句 except //异常处理块 异常处理语句 //异常不发生,不处理 end;[/codesyntax] Except关键字后面经常还可以加一系列“on…do”语句: [codesyntax lang="delphi"]
try //try 保护代码块 被保护语句 except //异常处理块 on <异常对象类型 1> do <语句 1> //捕获指定类型的异常对象,进行处理 on <异常对象类型 n> do <语句 n> //捕获指定类型的异常对象,进行处理 else <语句 n+1> //默认的异常处理代码 end;[/codesyntax] [codesyntax lang="delphi"]
try b:= StrToFloat(edit1.Text); c:= StrToFloat(edit2.Text); a:= b /c; Edit3.Text:= FloatToStr(a); except on Ezerodivide do Edit3.Text:='不能用 0 除'; on EMathError do Edit3.Text:='计算错误'; else Edit3.Text:='发生异常'; end;[/codesyntax]
异常保护与 try…finally 语句
确保回收分配的资源是程序健壮性的一个关键,一般说来需要保护的资源包括:文件、内存、Windows资源和对象。 下面一段程序就会造成1KB的内存资源的丢失: [codesyntax lang="delphi"]n:= 0; GetMem(pPointer, 1024); //分配 1KB 的内存 m:= 10 div n; //这里将触发被零除的异常 FreeMem(pPointer, 1024); //永远执行不到这里[/codesyntax] try…finally 语句的一般格式如下: [codesyntax lang="delphi"]
try //try 保护代码块 被保护语句 finally //异常处理块 异常处理语句 //无论异常发生否,都必须处理 end;[/codesyntax] [codesyntax lang="delphi"]
n:= 0; GetMem(pPointer, 1024); //分配 1KB 的内存 try m:= 10 div n; //这里将触发被零除的异常 finally FreeMem(pPointer, 1024); // 必须被执行 end;[/codesyntax]