У меня есть клиент/серверное приложение, разработанное в delphi XE, которое использует TIdTcpClient
(Indy10) для связи друг с другом. Все отлично работает больше всего времени, единственная проблема, когда я убиваю на сторону сервера, клиент поднимает исключение, которое каким-то образом повышает весь путь к пользователю, он первый показать свое собственное исключение:Indy 10 повышение нежелательного исключения
и после этого отобразить диалог об ошибке в пустой, как показано ниже:
Это код, который должен переопределить исходное исключение, диалог я создаю дисплей и другое диалоговое окно (изображение выше) дисплей сразу после.
constructor EtvdNTierTcpException.Create(const AException: Exception);
const
error = 'error message';
var
AIdSocketError: EIdSocketError;
sMessage, sConnectionPoint: string;
begin
if AException is EIdSocketError then
begin
AIdSocketError := AException as EIdSocketError;
if StvdDefaultSession.tvdConnectionPoint = cpSqlProxy then
sConnectionPoint := FtvdNTierSqlProxy
else
sConnectionPoint := FtvdNTierSqlServer;
case AIdSocketError.LastError of
// 10054: Connection reset by peer
10054: self.Message := ExtractFileName(application.exename) + error + DateToStr(Now) + ' ' + TimeToStr(Now) + ' (' + AIdSocketError.ClassName + ')' + 'Connection for dataset fail at(10054)';
// 10061: Connection refused
10061: self.Message := ExtractFileName(application.exename) + error + DateToStr(Now) + ' ' + TimeToStr(Now) + ' (' + AIdSocketError.ClassName + ')' + 'Connection for dataset fail at(10061)';
else
self.Message := error + DateToStr(Now) + ' ' + TimeToStr(Now) + ' (' + AIdSocketError.ClassName + ')' + 'Connection for dataset fail at('+IntToStr(AIdSocketError.LastError)+')';
end;
end;
inherited;
end;
Я пытаюсь использовать CheckForGraceFulDisconnect(false);
, но это не делает никакой разницы, какие идеи в том, чтобы остановить Инди отображения этой ошибки?
Это как исключение выше получить рейз:
function TtvdNTierDataSet.tvdStmtExecute(const AStmt: string): Boolean;
begin
try
tvdStmtExecute := False;
// check we are still connected to the server
if tvdSession.tvdConnect then
begin
tvdStmtExecute := True;
// write the SQL Statement to the server
tvdWriteOutput;
end;
except
on E: Exception do
begin
// re-raise the exception
raise EtvdNTierTcpException.Create(E);
end;
end;
end;
Вы не должны переопределять исходный код. Вы используете TCPClient в основном потоке? Вы должны использовать отдельный поток. Наконец, попробовали ли вы попробовать/за исключением операций TCPClient? Вы должны поймать любое исключение. – smooty86
Вы не указали, откуда вызывается 'EtvdNTierTcpException.Create()', или в каком коде создается исходное исключение. Indy не создает исключение при отключении до следующего доступа к базовому сокету. И изменить первоначальное исключение, как правило, неправильно. Предполагая, что «EtvdNTierTcpException» является потоком «Исключение», подумайте об использовании «try/except», который улавливает исходное исключение и использует «Exception.RaiseOuterException()», чтобы поднять ваше собственное исключение, которое фиксирует исходное исключение как его «InnerException» без изменения Это. –
@RemyLebeau вызывается, когда исключение возбуждается Indy, я поймаю исключение и подниму его вместо – Icaro