我调用connect方法后,出现异常,异常可能是dns解析错误,或者服务器连接错误等,那我怎么才能获得具体是什么类型的错误异常呢?例如:
      try
      FTP.Connect;
      except
         case ()of   
         //Application.MessageBox('adf','adf',MB_OK);
      end;
这里的case of怎么写才会将不同才异常取出呢?
例如如果是dns解析失败,则提示dns解析错误,服务器连接错误就提示服务器未开启等等请教

解决方案 »

  1.   

        try
          Result := UrlDownloadToFile(nil,   PChar(source),   PChar(Dest),   0,   nil)   =   0;
        except
          on E: Exception do begin
            ShowMessage('error:'+ e.Message);
            Result := False;
          end;
        end;
      

  2.   

    这种的话,能够获得idftp抛出的异常的整个异常信息,是个ansistring。对这个ansistring进行判断的话,比较麻烦,有其他的异常判断的方法么?对于idftp来说
      

  3.   

    另外,delphi中的except中的on xx do xx
    转到bcb中对应是?
    bcb中的
    try
    {
    }
    catch()
    {
    }catch括号里面的好像是类型
      

  4.   


    try
      FTP.Connect;
    except
      case GetLastError of
        9001:ShowMessage('DNS 服务器无法解释格式');
        9002:ShowMessage('DNS 服务器失败');
        10060:ShowMessage('由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败');
        10061:ShowMessage('能做任何连接,因为目标机器积极地拒绝它');
        ...
      end;
    end;
      

  5.   

    To 6,7楼,在IdFTP内部使用了Exception机制抛出异常,此时OS Last Error已经被改写为0,在except当中已无法使用GetLastError取得具体的错误号.
      

  6.   


    getlasterror我试过了,的确不行,那么这时怎么才能取得正确的错误号呢?难道要对错误message进行比较?
      

  7.   

    僵哥说的不错,GetLastError已经不能获取正确的错误值,不过可以用IdException来获取,uses IDException;
      try
        FTP.Connect;
      except
        on E:EIdSocketError do
        begin
          case E.LastError of
            9001:ShowMessage('DNS 服务器无法解释格式');
            9002:ShowMessage('DNS 服务器失败');
            10060:ShowMessage('由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败');
            10061:ShowMessage('不能做任何连接,因为目标机器积极地拒绝它');
          end;
        end;
      end;
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      try
        IdFTP1.Connect;
      except
        On E:Exception do begin
          if E is EIdSocketError then begin
            case EIdSocketError(E).LastError of
              WSANOTINITIALISED: ShowMessage('未应用程序没有调用 WSAStartup,或者 WSAStartup 失败,或者在此之前调用了 WSACleanup。');
              WSAENETDOWN: ShowMessage('套接字操作遇到了一个已死的网络。网络子系统已经失效.');
              WSAEADDRINUSE: ShowMessage('端口被占用,通常每个套接字地址(协议/网络地址/端口)只允许使用一次。');
              WSAEINTR: ShowMessage('一个封锁(阻塞)操作被使用 WSACancelBlockingCall 的调用中断。');
              WSAEINPROGRESS: ShowMessage('目前正在执行一个阻塞性操作。');
              WSAEALREADY:ShowMessage('在一个非阻塞性套接字上尝试了一个已经在进行的操作。 ');
              WSAEADDRNOTAVAIL:ShowMessage('请求的地址无效。');
              WSAEAFNOSUPPORT: ShowMessage('使用了与请求的协议不兼容的地址。');
              WSAECONNREFUSED: ShowMessage('连接被远程主机拒绝');
              WSAEFAULT: ShowMessage('系统检测到在一个调用中尝试使用指针参数时的无效指针地址。');
              WSAEINVAL: ShowMessage('提供了一个无效的参数。连接所使用的套接字描述符可能正在监听中。');
              WSAEISCONN: ShowMessage('在一个已经连接的套接字上做了一个连接请求。');
              WSAENETUNREACH: ShowMessage('向一个无法连接的网络尝试了一个套接字操作');
              WSAEHOSTUNREACH: ShowMessage('套接字操作尝试一个无法连接的主机。');
              WSAENOBUFS: ShowMessage('由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。');
              WSAENOTSOCK: ShowMessage('在一个非套接字上尝试了一个操作。套接字描述符(Socket)无效');
              WSAETIMEDOUT: ShowMessage('由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。');
              WSAEWOULDBLOCK:ShowMessage('无法立即完成一个非阻止性套接字操作。在非阻塞操作当中,通常此错误表示操作成功。');
              WSAEACCES: ShowMessage('以一种访问权限不允许的方式做了一个访问套接字的尝试。');
            end;
          end;
        end;
      end;end;