Для меня не очевидным был этот вопрос. Хотелось получить информацию об ошибке сервера на клиенте. То есть, примерно так…
Ведь idHTTPServer многопоточный, и значит, возбуждение исключения при ошибке можно было сделать так
Как обработать исключение из потока?
Но idHTTP и idHTTPServer почти всегда находятся в разных приложениях, и значит объекты Application у них разные. Поэтому такой способ не подойдет.
Но всё оказалось проще, чем я думал. Пришлось потратить какое-то время на нюансы. Но в целом, результат есть.
На idHTTPServer в CommandGet пишем следующее (имитируем ошибку деления на ноль)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
... SomeInteger:=12; Zero:=0; try SomeInteger:=Trunc(SomeInteger/Zero); except on E:Exception do begin AResponseInfo.ContentText:='Server Error '+'Class='+E.ClassName+' / Message='+E.Message;// 'testing ok'; AResponseInfo.WriteContent; raise Exception.Create('Server Error '+E.ClassName+E.Message); end; //AResponseInfo.ContentText:='testing ok2'; //AResponseInfo.WriteContent; // this will not show testing ok2! end; ... |
Если мы напишем второй раз
1 2 |
//AResponseInfo.ContentText:='testing ok2'; //AResponseInfo.WriteContent; // this will not show testing ok2! |
Данные инструкции, то на клиент сообщение “testing ok2′ не попадет, я так понимаю WriteContent можно использовать в данном случае один раз. Можно покопаться в исходниках и понять почему.
На клиенте наше исключение попадает в результат метода POST компонента idHTTP
1 |
MyServerResponse:=idHTTP.Post(HTTPServerToRequest+'/CreateDirOnServer', PostData); |
Ну а далее, если это скажем, не тот ответ сервера, который нам нужен, на клиенте мы просто возбуждаем исключение с сообщением от сервера, скажем, так
1 |
if MyServerResponse<>'ok' then raise Exception.Create(MyServerResponse); |
И отлавливаем его в except блоке на клиенте, примерно так (пример из проекта)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
{Creating dir on Server} procedure THTTPRequests.CreateDirOnServer(dir:string; MyServerResponse:string); var PostData: TIdMultiPartFormDataStream; FileName:string; Error:string; ResponseText:string; begin if not IsHTTPConnectionOk(Error,ResponseText) then Exit; with VisualFrame_HTTP_UnitVar do begin begin PostData := TIdMultiPartFormDataStream.Create; try idHTTP.Request.Referer := HTTPServerToRequest+'/CreateDirOnServer'; // 'http://localhost:40000/sendfile'; // http://www.link.net/download'; idHTTP.Request.ContentType := 'multipart/form-data'; PostData.AddFormField('Login', 'SomeLogin'); PostData.AddFormField('Password', 'SomePassword'); PostData.AddFormField('DirectoryToCreate', dir); // PostData.AddFile('attach', FileName, 'application/x-rar-compressed'); // PostData.AddFormField('action', 'post'); try MyServerResponse:=idHTTP.Post(HTTPServerToRequest+'/CreateDirOnServer', PostData); if MyServerResponse<>'ok' then raise Exception.Create(MyServerResponse); Application.ProcessMessages; except on E:EidHttpProtocolException do begin ShowMessage( 'EidHttpProtocolException: ' + E. Message); end; on E: EIdException do begin ShowMessage( 'An network error occurred while trying to connect: ' + E. Message); end; on E: Exception do begin ShowMessage( 'An unknown error occurred while trying to connect: ' + E. Message); end; end; finally if(Assigned(PostData)) then PostData.Free; // ShowMessage('idHTTP Sent OK'); end; end; end; end; |
Вот в принципе и всё!