Newsgroup: it.comp.lang.delphi
Titolo: d5e Eccezioni in un thread

Ciao a tutti.
Ho una applicazione multithreading nella quale il problema è che a runtime
non riesco a trappare eventuali eccezioni:
in caso di errori si chiude e buonanotte.
Ho una operazione in particolare che è poi quella + critica nella quale:
try
  miaOp
except
  on e:exception do begin
    LogManager.Acquire;
    try
      Logmanager.AddToLog(E.Message);
      finally
      LogManager.release;
    end;
  end;
...
Nelle uses del th è inclusa la sysutils quindi il gestore delle eccezioni
dovrebbe essere installato.
Forse che devo usare l'evento OnException di TApplication?
Tnx
A.

 wrote:
Hai provato prima a circoscrivere il problema cosi?
try
   Logmanager.AddToLog('Prima di miaOP');
   miaOp
   Logmanager.AddToLog('Dopo di miaOP');
except
...
Di solito gli scoppi senza possibilita' di trap sono dovuti a dll balorde.
Se postassi piu' codice tenterei di riprodurlo.
Ciao
--
Buon      .-""",
 Natale    /____, \
          {_____}`{} 
Buone    (/ . . \)
 Feste   {`-=^=-`}
         {   `   }
          {     }jgs
Morde.     `-,-`

io ho idea di quali siano i punti critici della mia app.
Essa crea un file di log in formato txt dove scrivo TUTTO.
Il mio problema non è tanto "trovare" l'errore quanto impedire che la
applicazione si chiuda in caso di errore.
Vorrei cioè che:
1)  la mia app mi segnalasse che si è verificata una eccezione
Il messaggio lo dirotterei sul log per averne traccia, ma serebbe poi
inviato o via email o via sms a qualcuno di noi
2) evitare il raise con il conseguente apparire di una dialog di errore e
continuare l'esecuzione.
Trattasi di un app server alla quale si connettono via collegamento remoto
circa 50 clients
Non voglio dover venire qui in ufficio nel weekend xche un client non si
connette visto che la app è andata giu.
Buon feste??? Magari! :((
Tnx
A.

applicazione si chiuda in caso di errore.
Difficile dirti la soluzione, se questa esiste, quando uno scoppio fa chiudere il programma anche sotto try.
Proprio l'altro giorno sono impazzito per un motivo analogo, e poi ho scoperto che andava aggiornata una dll riferita
all'mdac 2.6
A questo punto, se non riesci a trovare la soluzione software adatta, potresti giocare d'anticipo
prevedendo le condizioni di errore e facendo un raise pilotato. in questa maniera eviteresti lo scoppio e il
down del servizio, loggando cmq l'errore senza perdere l'applicativo.
Scusami se non ti so dire qualcosa di piu', io farei cosi', anche perche' suppongo che non ci sono bug nel tuo software,
quindi conviente giocare d'anticipo che impazzire cercando di trappare l'intrappabile.
Buona fortuna!


 Scusami se non ti so dire qualcosa di piu', io farei cosi', anche perche'
suppongo che non ci sono bug nel tuo software,
ahahahahahahahahahahahahahahahahahhahahaha!
magari!!!!
La mia domanda č: xche nel thread il try..except non va?
E' normale oppure ho scirtto kazzate nel codice?
Bye
A.

>
tieni presente che nell'archivio dove ho cercato ci sono migliaia di risposte di Below, e parecchie
parlano di thread: questo archivio lo puoi torvare qui (8 Mb)
http://delphi.icm.edu.pl/ftp/docs/pbelow.zip
Spero di averti dato una mano e non fuorviato...
Ciao


...
La mia impressine è che sia LogManager a sollevare un'eccezione, che
non venendo trappata ti fa uscire dalla thread.
questa è una mia porzione di codice in una thread:
with DataMod do begin
   try
      DropRecord.ExecSQL;
    except
      on E: Exception do
        AddLogInfo( E.Message + ' (' + E.ClassName + ')', True);
    end;
 end;
e l'except viene gestito correttamente.
AddLogInfo chiama una classe che a sua volta si autogestisce (non
solleva mai eccezioni).

Hello Al,
Questo è quello che faccio io nel mio componente per comunicazione over
socket:
procedure TCustomRemoteClient.HandleException;
var
 E : Exception;
begin
 E:=Exception(ExceptObject);
    MessageDlg(E.Message,mtError,[MBOK],0);
    Close;
end;
procedure TCustomRemoteClient.Execute;
begin
 while (not Terminated) and (fSktClient.Active) do
  begin
        try
           if (not Terminated) and (fSktClient.Active) and
Stream.WaitForData(50) then
           begin
             try
                    bla...
                    bla...
                    bla...
                    Meglio nascondere il casino che ho combinato ;)
             except
                 Synchronize(HandleException);
             end; // End del Try...Except
           end;
        finally
         Stream.Free;
        end;
    end;
end;
La Synchronize(HandleException) fa si che l'eccezione venga gestita nel
Thread principale (quello della VCL).
Spero possa servirti.
Saluti e tantissimi auguri a tutti,
Carmine

 Thread principale (quello della VCL).
Azz, Carminie!
Forse è questo il mio vero problema.
Se va, tieni un caffe pagato alla caffettiera a Napoli!
Scegli tu se a piazza vanvitelli o a piazza dei martiri.
Statt' 'bbuono e tnx
A.


 Statt' 'bbuono e tnx
Spero ti sia di aiuto
Statte bbuono pure tu!
Carmine
(Presidente Comitato per la "nationalization" di Delphi in Napoletano) :)