0

嗨,我是使用 Delphi 的新手,正在尝试编写一个应用程序来检查网站是否已启动或是否有任何问题。我正在使用 Indy 的 IdHTT。问题是它会捕获任何协议错误,但不会捕获套接字错误之类的东西。

procedure TWebSiteStatus.Button1Click(Sender: TObject);
  var
    http : TIdHTTP;
    url : string;
    code : integer;
  begin
     url := 'http://www.'+Edit1.Text;
     http := TIdHTTP.Create(nil);
     try
       try
         http.Head(url);
         code := http.ResponseCode;
       except
         on E: EIdHTTPProtocolException do
           code := http.ResponseCode; 
         end;
         ShowMessage(IntToStr(code));
         if code <> 200 then
         begin
           Edit2.Text:='Something is wrong with the website';
           down;
         end;
     finally
       http.Free();
     end;
  end;

我基本上是在尝试捕捉任何不是网站正常的事情,所以我可以调用另一个表格,该表格将设置一封电子邮件告诉我网站已关闭。

更新:首先,您是对的,我确实错过了“然后”,很抱歉正在删除其他代码,并且被错误地删除了。在处理异常时我不知道具体到一般情况谢谢。最后我确实找到了我要找的是这里的代码

on E: EIdSocketError do    

使用使用 IdStack

4

1 回答 1

5

更改代码以捕获所有异常,或者添加更具体的异常:

url := 'http://www.'+Edit1.Text;
http := TIdHTTP.Create(nil);
try
  try
    http.Head(url);
    code := http.ResponseCode;
  except
    on E: EIdHTTPProtocolException do
    begin
      code := http.ResponseCode; 
      ShowMessage(IntToStr(code));
      if code <> 200 
      begin
        Edit2.Text:='Something is wrong with the website';
        down;
      end;
    end;
    // Other specific Indy (EId*) exceptions if wanted
    on E: Exception do
    begin
      ShowMessage(E.Message);
    end;
  end;  // Added missing end here.
finally
  http.Free();
end;

请注意,如果您要处理多种异常类型,从最具体到最不具体是很重要的。换句话说,如果您首先放置不太具体(更一般的类型)的异常,则会发生以下情况:

try
  DoSomethingThatCanRaiseAnException();
except
  on E: Exception do
    ShowMessage('This one fires always (covers all exceptions)');
  on E: EConvertError do
    ShowMessage('This one will never happen - never gets this far');
end;

这个可以正常工作,因为它更具体到不太具体。正确地,它会被逆转:

try
  DoSomethingThatCanRaiseAnException();
except
  on E: EConvertError do
    ShowMessage('This one gets all EConvertError exceptions');
  on E: Exception do
    ShowMessage('This one catches all types except EConvertError');
end;
于 2013-10-08T20:33:44.003 回答