有一用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”是什么
感谢!

解决方案 »

  1.   

    try exception 是异常机制的一种,E 是异常的值          异常处理
        一、定义异常    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;
      

  2.   

    to: tsst(田sir)
    你是说 Exception 是一个类,而E是Exception类的一个对像。
    是这样的吗?
      

  3.   

    那如何知道是Delphi的基类是呢
    或者说Delphi自带的类在什么地方可以找到它的名字及用法呢