2015-06-16 5 views
-1

У меня есть клиент/серверное приложение, разработанное в delphi XE, которое использует TIdTcpClient (Indy10) для связи друг с другом. Все отлично работает больше всего времени, единственная проблема, когда я убиваю на сторону сервера, клиент поднимает исключение, которое каким-то образом повышает весь путь к пользователю, он первый показать свое собственное исключение:Indy 10 повышение нежелательного исключения

enter image description here

и после этого отобразить диалог об ошибке в пустой, как показано ниже:

enter image description here

Это код, который должен переопределить исходное исключение, диалог я создаю дисплей и другое диалоговое окно (изображение выше) дисплей сразу после.

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; 
+0

Вы не должны переопределять исходный код. Вы используете TCPClient в основном потоке? Вы должны использовать отдельный поток. Наконец, попробовали ли вы попробовать/за исключением операций TCPClient? Вы должны поймать любое исключение. – smooty86

+2

Вы не указали, откуда вызывается 'EtvdNTierTcpException.Create()', или в каком коде создается исходное исключение. Indy не создает исключение при отключении до следующего доступа к базовому сокету. И изменить первоначальное исключение, как правило, неправильно. Предполагая, что «EtvdNTierTcpException» является потоком «Исключение», подумайте об использовании «try/except», который улавливает исходное исключение и использует «Exception.RaiseOuterException()», чтобы поднять ваше собственное исключение, которое фиксирует исходное исключение как его «InnerException» без изменения Это. –

+0

@RemyLebeau вызывается, когда исключение возбуждается Indy, я поймаю исключение и подниму его вместо – Icaro

ответ

0

если исключение не относится к типу EIdSocketError вы получите пустой Exception Dialog.

if AException is EIdSocketError then 
+0

Это неверно, если исключение не относится к типу EIdSocketError, я получаю исходный код исключения, я уже тестирую это. – Icaro

Смежные вопросы