Delphi内建异常类 异常处理参考
标签: delphiexceptionwindowscasting编程integer
2012-05-19 12:53 2579人阅读 评论(0) 收藏 举报
分类:
Delphi(96)
【详细过程】
Eabort:静静的触发异常而不提示任何信息对话框,调用abort函数触发此异常;
Eabstracterror:程序企图调用一个纯虚拟方法(abstract method)时产生异常;
Eaccessviolcation:无效内存(memory)处理操作;
Eassertionfailed:当代入asscert的函数的参数的值为false时;
Econtrolc:于console模式的应用程序中按下CTRL+C;
Econversionerror:几何方面(measurement)的转型错误;
Econverterror:字符串和对象方面的转型错误;
Edivbyzero:整数除0的错误;
Eexternnal:捕获WINDOWS系统异常记录时;
Eexternalexception:无效的异常程序代码;
Einouterror:文件输入、输出的错误;
Eintfcasterror:接口指定(interface casting)的错误;
Eintoverflow:整数计算后的结果超过所配置的register;
Einvalidcast:无效的typecast;
Einvalidpointer:无效的指针操作;
Einvalidop:未定义的浮点操作;
Ematherror:浮点(float-point)数学上的错误;
Eoserror:操作系统运行错误;
Eoutofmemory:无法成功配置内存;
Eoverflow:浮点register溢位;
Epackageerror:封包关联(package-related)上的错误;
Veprivilege:处理程序特权违法;
Epropreadonly:以OLE自动写入属性(property)无效;
Epropwriteonly:以OLE自动读取属性无效;
Erangeerror:整数值超出范围;
Esafecallexception:因使用SAFECALL所产生的问题;
Estackoverflow:堆栈过多;
Eunderflow:其值太小而无法用浮点数表示;
Evarianterror:与variant数据类型有关的错误;
Ewin32error:windows系统方面的错误;
Exception:所有运行时异常基础类型;
Ezerodivide:浮点数(float-point)除以0的错误;
12.1.2.1 流异常类
流异常类包括EStreamError、EFCreateError、 EFOpenError、EFilerError、EReadError、EWriteError、EClassNotFound。它们的结构关系如下:
EStreamError
|---------- EFCreateError
|---------- EFOpenError
|---------- EFilerError
|--------- EReadError
|--------- EWriteError
|--------- EClassNotFound
图12.1 流异常结构图
流异常在Classes库单元中定义。
流异常引发的原因如表12.6。
表12.6 流异常类及其产生原因
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
异常类 引发原因
─────────────────────────────────
EStreamError 利用LoadFromStream方法读一个流发生错误
EFCreateError 创建文件时发生错误
EFOpenError 打开文件时发生错误
EFilerError 试图再次登录一个存在的对象
EReadError ReadBuffer方法不能读取特定数目的字节
EWriteError WriteBuffer方法不能写特定数目的字节
EClassNotFound 窗口上的部件被从窗口的类型定义中删除
12.2 异常保护
确保回收分配的资源是程序健壮性的一个关键。但缺省情况下异常发生时程序会在出错点自动退出当前模块,因此需要一种特殊的机制来确保即使在异常发生的情况下释放资源的语句仍能被执行。而Delphi的异常处理正提供了这种机制。
12.2.1 需要保护的资源
一般说来需要保护的资源包括:
● 文件
● 内存
● Windows资源
● 对象
在异常保护的情况下,当异常发生时,系统会自动弹出一个消息框用于显示异常的消息。退出当前模块后异常类自动清除。
异常响应为开发者提供了一个按自己的需要进行异常处理的机制。try …except …end形成了一个异常响应保护块。与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块。当异常被响应后异常类自动清除。
下面的例子表示了文件打开、删除过程中发生异常时的处理情况:
uses Dialogs;
var
F: Textfile;
begin
OpenDialog1.Title := 'Delete File';
if OpenDialog1.Execute then
begin
AssignFile(F, OpenDialog1.FileName);
try
Reset(F);
if MessageDlg('Erase ' +OpenDialog1.FileName + '?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
System.CloseFile(F);
Erase(F);
end;
except
on EInOutError do
MessageDlg('File I/O error.', mtError, [mbOk], 0);
on EAccessDenied do
MessageDlg('File access denied.', mtError, [mbOk], 0);
end;
end;
end.
保留字on…do用于判断异常类型。必须注意的是:except后面的语句必须包含在某一个on…do模块中,而不能单独存在。这又是同finally不同的一个地方。
12.3.1 使用异常实例
上面所使用的异常响应方法可总结为如下的形式:
on ExceptionType do
{响应某一类的异常}
这种方法唯一使用的信息是异常的类型。一般情况下这已能满足我们的需要。但我们却无法获取异常实例中包含的信息,比如异常消息、错误代码等。假设我们需要对它们进行处理,那么就必须使用异常实例。
为了使用异常实例,需要为特定响应模块提供一个临时变量来保存它:
on EInstance : ExceptionType do …
在当前响应模块中我们可以象使用一个普通对象那样来引用它的数据成员。但在当前响应模块之外不被承认。
下面的代码用于获取异常消息并按自己的方式显示它:
{窗口中包括一个ScrollBar部件,一个Button部件}
procedure TErrorForm.Button1Click(Sender: TObject);
begin
try
ScrollBar1.Max := ScrollBar1.Min-1;
except
on E: EInvalidOperation do
MessageDlg('Ignoring Exception:'+E.Message,
mtInformation,[mbOK],0);
end;
end;
12.3.2 提供缺省响应
在异常响应模块中,一般我们只对希望响应的特定异常进行处理。如果一个异常发生而响应模块并没有包含对它的处理代码,则退出当前响应模块,异常类仍被保留。
为了保证任何异常发生后都能在当前响应模块中被清除,可以定义缺省响应:
try
{程序正常功能}
except
on ESomething do
{响应特定异常}
else
{提供缺省响应}
end;
由于else可以响应任何异常,包括我们一无所知的异常,因此在缺省响应中最好只包括诸如显示一个消息框之类的处理,而不要改变程序的运行状态或数据。
12.3.6 利用异常响应编程
利用异常处理机制不仅能使程序更加健壮,而且也提供了一种使程序更加简捷、明了的途径。事实上,使用自定义异常类就是一种利用异常响应编程的方式。这里我们再讨论几个利用标准异常类编程的例子。
比如为了防止零作除数,可以在进行除法运算前使用if…then…else语句。但如果有一系列这样的语句则繁琐程度是令人难以忍受的。这时候我们可能倾向于使用EDivByZero异常。例如如下一段程序就远比用if…then…else实现简捷明了。
function Calcu(x,y,z,a,b,c:Integer):Real;
begin
try
Result := x/a+y/b+z/c ;
except
on EDivByZero do
Result := 0;
end;
end;
在(6.2.3)记录文件的打开与创建中就是利用异常响应来实现文件的打开或创建。
procedure TRecFileForm.OpenButtonClick(Sender: TObject);
begin
if OpenDialog1.Execute then
FileName := OpenDialog1.FileName
else
exit;
AssignFile(MethodFile,Filename);
try
Reset(MethodFile);
FileOpened := True;
except
on EInOutError do
begin
try
if FileExists(FileName) = False then
begin
ReWrite(MethodFile);
FileOpened := True;
end
else
begin
FileOpened := False;
MessageDlg('文件不能打开',mtWarning,[mbOK],0);
end;
except
on EInOutError do
begin
FileOpened := False;
MessageDlg('文件不能创建',mtWarning,[mbOK],0);
end;
end;
end;
end;
if FileOpened = False then exit;
Count := FileSize(MethodFile);
if Count > 0 then
ChangeGrid;
RecFileForm.Caption := FormCaption+' -- '+FileName;
NewButton.Enabled := False;
OpenButton.Enabled := False;
CloseButton.Enabled := True;
end;
总之,利用异常响应编程的中心思想是虽然存在预防异常发生的确定方法,但却对异常的产生并不进行事前预防,而是进行事后处理,并以此来简化程序的逻辑结构。
Delphi内建异常类 异常处理参考的更多相关文章
- python 一些重要的内建异常类
- 7.1.2 Python 内置异常类层次结构
这一节就是拿来主义了,连接:https://blog.csdn.net/Karen_Yu_/article/details/78629918 异常名称 描述 BaseException 所有异常的基类 ...
- django 内建标签和过滤器参考
下面的标签和过滤器参考就是为那些没有 admin 站点的可用的人准备的.由于 Django 是高度可定制的,你的 admin 里的关于标签和过滤器的参考可以认为是最可信的. 内建标签参考 block ...
- Python的程序结构[2] -> 类/Class[6] -> 内建类 map
内建类map / Built-in Type map 关于内建类 map 是一个内建的类,能够返回一个 map 的 obj.map 的第一个参数为一个可执行函数,后续参数均为可迭代对象,map 会分别 ...
- Python标准异常和异常处理详解
python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 1.异常处理: 本站Python教程会具体介绍. 2.断言(Asserti ...
- [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)
无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...
- python高级编程之(类级):子类内建类型
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一( ...
- java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类
package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...
- python的异常处理及异常类定义
python的异常处理语法和大多数语言相似: try: try块的语句... except exceptiontype1 as var:#使用as语句获得本次捕获到的异常的实例var except块语 ...
随机推荐
- mac 格式化U盘
作者:Bailm链接:https://www.zhihu.com/question/27888608/answer/486347894来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- thinkphp5 图片上传七牛云
<?php namespace app\cxc\controller; use Qiniu\Auth; use Qiniu\Storage\UploadManager; use think\Co ...
- Mybatis笔记 - SQL标签方法
Mpper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一.内容标签 1.NamePlac ...
- 76、python学习第二篇
生成随机数的测试数据 ''' Created on 2017年4月8日 @author: weizhen #to create data for testing ''' import random f ...
- python requests方法post请求json格式处理
方法如下: import requestsimport json data = { 'a': 123, 'b': 456} ## headers中添加上content-type这个参数,指 ...
- RabbitMQ(七)心跳控制 -- heartbeat
https://blog.csdn.net/jiao_fuyou/article/details/23186407
- Spring MVC请求参数绑定 自定义类型转化 和获取原声带额servlet request response信息
首先还在我们的框架的基础上建立文件 在domian下建立Account实体类 import org.springframework.stereotype.Controller; import org. ...
- python运行时禁止生成pyc文件
方法 在环境变量文件~/.bashrc中添加 export PYTHONDONTWRITEBYTECODE=False source ~/.bashrc加载即可 如何从项目中删除所有.pyc文件 fi ...
- overflow:hidden失效
overflow:hidden失效 为了页面的健壮性,我们常常需要使用overflow:hidden.有时候是为了防止布局被撑开,有时候是为了配合其它规则实现文字截断,还有时候纯粹是为了创建块级上下文 ...
- JavaScript去除数组中重复的数字
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...