有一用NMFTP组件开发一个在Internet上进行文件下载的程序,其中登录代码如下:
Procedure TForm1.Button1Click(Sender: TObject);
begin
NMFTP1.Host:=HoxtTxt.Text;
NMFTP1.Port:=StrToInt(PortTxt.Text);
NMFTP1.Timeout:=5000;
NMFTP1.UserID:=userTxt.Text;
NMFTP1.Password:=PassTxt.Text;
try
NMFTP1.Connect;
NMFTP1.ParseList:=True;
NMFTP1.List;
except
On E : Exception do
if E.message='something'
then writeln('poo');
end
end;
其中异常处理段“E : Exception ”是什么意思,
“E”又是什么,
“Exception”是什么
感谢!
Procedure TForm1.Button1Click(Sender: TObject);
begin
NMFTP1.Host:=HoxtTxt.Text;
NMFTP1.Port:=StrToInt(PortTxt.Text);
NMFTP1.Timeout:=5000;
NMFTP1.UserID:=userTxt.Text;
NMFTP1.Password:=PassTxt.Text;
try
NMFTP1.Connect;
NMFTP1.ParseList:=True;
NMFTP1.List;
except
On E : Exception do
if E.message='something'
then writeln('poo');
end
end;
其中异常处理段“E : Exception ”是什么意思,
“E”又是什么,
“Exception”是什么
感谢!
一、定义异常 Delphi已经定义了一些最常用到的异常,在应用程序中可以直接处理这些异常,另外,也可以在应用程序中单独定义一些异常,然后对这些异常进行处理。 1)异常的基类Exception Delphi中所有异常的基类是Exception 对象,他直接继承于所有组件的
父类TObject 对象,封装了所有异常的基本属性和方法,你可以在这个对象
的基础上,建立自定义的异常。
Exception 对象有两个属性:
HelpConText:异常帮助信息的序列号;
Message:弹出对话框,描述异常。
Exception 对象的主要方法是Create方法:
constructor Create(const Msg:string);
用于创建一个异常的实例,该实例可以显示错误信息,
也可以直接用这个方法来提交一个异常。
Msg 为错误信息字符串。 下面做异常的实例的时候,要注意结构化异常处理只有在Project ->
Build 以后的.exe文件直接运行才能反映,直接Run 会出错。
实例: procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
begin
try
a:=0;
b:=5/a;
edit1.Text:=floattostr(b);
except
raise exception.Create('你的除数是0');
end;
end;
2)Delphi定义的异常: Delphi在多个标准库中定义了比较通用的异常,主要列出如下: 在Sysutils库中: EAbort 应用程序遇到错误不希望有弹出对话框,可以使用该异常
EAccessViolation 无效内存访问错误
EAssertionFailed 执行Assert过程返回值是false
EControlC 在控制台应用程序中,按下Ctrl+C键遇到错误
EConvertError 在字符串或其它对象集转换是遇到错误
EDivByZero 整数除数是0
EInOutError 输入/输出错误
EIntOverflow 整数运算时,结果超过变量定义范围
EMathError 浮点运算出现错误
EOutOfMemory 超出内存错误
EOverflow 浮点运算返回结果超出变量定义范围
ERangeError 整数数值超出变量定义范围
EStackOverflow 堆栈溢出错误
EWin32Error Windows错误
EZeroDivide 浮点运算除数是0 在其它库中: EdatabaseError 数据库错误, 在db库中定义
EUpdateError 数据集提供者错误 在db库中定义
EADOError ADO数据库错误 在adodb库中定义
EDBEngineError 出现BDE错误 在dbtables库中定义
ENoResultSet 没有成功打开一个数据集查询。
3)自定义异常 在特殊情况下,在Delphi定义的异常不能满足要求的时候,可以自己
定义异常。
定义异常最普遍的方法,是通过Exception定义,因为Exception是所
有异常的祖先,其它异常都是通过Exception定义的,比如在SysUtils 库
中,就是通过Exception声明一个数学运算异常: type
EMathError=class(Exception)
end;
我们一般可以通过继承Exception的子对象来定义异常,例如: type
EMathError=class(Exception)
EZeroDivide=class(EMathError)
EOverflow=class(EMathError)
end; 其中EZeroDivide和EOverflow几种异常都继承于EMathError。这几种
异常都可以通过EMathError来处理,但也可以单独处理每个异常,这样可
以使代码更加清晰。
二、处理异常 为了能够使程序正常进行,同时合理的释放资源,应用程序必须对异
常进行处理,以确保程序能够正常的运行。特别在数据很难预测的情况下,
这种保护机制就显得尤其重要。
下面分析Delphi提供的保护措施和各种异常的处理方法。 1)try ... finally 保护块 这个保护块的结构如下: .... try //受保护代码 finally //处理错误和释放资源代码
end; 作用:
不论受保护代码有没有错误,都跳到finally后面的语句执行,以确保
资源能够得到释放(包括受保护代码中存在Exit等语句)。 例如,下面的例子将确保文件能够被关闭: Reset(F)
try ....//受保护代码 finally CloseFile(F) end; 再举一个例子,有这样一个代码: procedure TForm1.Button1Click(Sender: TObject);
var Apointer:Pointer;
a,b:integer;
begin
a:=0;
getmem(Apointer,1024); //分配内存
b:=10 div a; //分母为0 的整数除
FreeMem(Apointer,1024); // 实际上该释放内存的语句无法执行,因为异常在先。
end; 这个语句由于没有异常保护,实际上内存是释放不掉的。
正确的方法是:
procedure TForm1.Button2Click(Sender: TObject);
var Apointer:Pointer;
a,b:integer;
begin
a:=0;
getmem(Apointer,1024); //分配内存
try
b:=10 div a; //分母为0的整数除
finally
FreeMem(Apointer,1024); // 合理的释放内存的语句
end;
end; 这就可以受保护的确保内存一定被释放。
2)try ... except 处理异常 try ... except异常保护模块的机制是,由except扑捉异常,然后在
except内处理异常,处理完毕后,释放异常对象,并向下继续运行。
处理异常的代码通常需要以on开头,在on ...do之间使用异常的名字,
处理异常的代码在do后面: try //受保护的代码 except on ...do ...
on ...do ...
on ...do ... end; 下面是一个例子: procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
begin
try
a:=0;
b:=5/a;
edit1.Text:=floattostr(b);
except
on EZeroDivide do showmessage('除数为零的错误')
end;
end; 有时候,也可以在on中直接用异常的基类声明一个异常实例,用于显示异
常信息和处理异常,例如: procedure TForm1.Button2Click(Sender: TObject);
var a,b:integer;
begin
try
a:=0;
b:=5 div a;
edit1.Text:=floattostr(b);
except
on EZeroDivide do showmessage('除数为零的错误');
on E:exception do showmessage(E.Message);
end;
end; 对于浮点数的分母为零,第一个异常并没有扑捉到,但第二个异常可以扑捉。 3)使用Raise处理异常: Delphi还提供了一种非常简洁的异常处理语句raise,通过这个语句,可以
随时在正常执行的语句中加入处理异常的语句。
raise语句可以提交一个异常的实例,例如下面的语句将产生一个除数为0
的异常实例: raise EZeroDivide.Create; 在实际应用中,raise常常在try保护块中扑捉遗漏的异常,例如下面的一
个关于异常保护的比较完整的结构例子:
(注意:ESomething 是一个符号,表示一个异常的名字,实际使用的时候
要根据情况改变。)
try ..... //正常执行的代码 try
... //特殊代码 except On ESomething do //ESomething 表示一个异常的名字
begin
...... //处理特殊异常的语句 Raise; //提交遗漏的异常 end; end; except On ESomething do .....; //处理其它的异常 end;
你是说 Exception 是一个类,而E是Exception类的一个对像。
是这样的吗?
或者说Delphi自带的类在什么地方可以找到它的名字及用法呢