2016-04-10 1 views
1

Я не уверен, если это лучший способ проверить, если исключение TIdHTTP поднимается, вот что я сделал:Как проверить, если TIdHTTP возбуждается исключение

HTTP := TIDHttp.Create(nil); 
try 
    try 
    HTTP.Head(URL); 
    SizeF := HTTP.Response.ContentLength; 
    code := HTTP.ResponseCode; 
    except 
    on E: Exception do 
    begin 
     code := HTTP.ResponseCode; 
     ShowMessage(IntToStr(code)); 
    end; 
end; 
finally 
    HTTP.Free; 
end; 
if code = 200 then 
    // go download the file using multiple threads. 

То, что я хочу достигнуть, (например, я уже это сделал), в противном случае программа продолжает работать и загружать файл. Так это правильный способ сделать это? Спасибо за ваши ответы.

+0

Да, вы просто используете попробовать/за исключением поймать каких-либо исключений в Head/Get/Post запрос. Обратите внимание, что загрузка не запускается, поскольку исключение прерывает процедуру - вы можете использовать Head, а затем Get в том же блоке. – smooty86

+1

Этот код проглатывает все исключения, независимо от их типа, и считывает код ответа, если он может быть определен неправильно. Я не думаю, что этот код делает то, что вы думаете. –

+0

Предполагается работать таким образом. Ему не нужно заботиться о типе исключения, если ему нужен только 1 результат. – smooty86

ответ

3

Как правило: только обрабатывайте исключения, когда можете и хотите их обрабатывать.

В противном случае пусть они просто текут, чтобы остановить текущее выполнение вашего кода. Без перехвата вы просто получите диалог с сообщением об исключении (это обрабатывается TApplication).

В этом случае вы можете изменить свой код

HTTP := TIDHttp.Create(nil); 
try 
    HTTP.Head(URL); 
    // if an exception is raised then the rest of the code will not be executed 
    // yes, the code in finally part will execute 
    SizeF := HTTP.Response.ContentLength; 
    code := HTTP.ResponseCode; 
finally 
    HTTP.Free; 
end; 

// check if all conditions are met 
if code <> 200 then 
    // if not, raise a custom exception as you like 
    raise Exception.Create('Not what I expected here'); 

// go download the file using multiple threads. 
+1

Если Head выбрасывает исключение (например, код 400 или 500), он не достигнет этой части «проверьте, выполнены ли все условия». – smooty86

+0

@ smooty86 Если глава бросает исключение, почему вы пытаетесь получить тот же URL? Проверка всех условий является всего лишь примером для исключения пользовательского исключения, не более –

+0

. В HTTP-сообщении есть много причин, почему он должен повторить попытку. Он должен обработать исключение в этом месте, а не вне его. – smooty86