[delphi] Exception in een thread wordt niet zichtbaar?

Pagina: 1
Acties:

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Ik was net bezig om mijn proggie op bugs te controleren toen ik een vaag probleem tegen kwam:

Op een gegeven moment moet er een Exception komen - en ik weet ook zeker dat deze er komt - alleen zie ik niets op het scherm verschijnen. Je krijgt dus geen dialog box te zien met de foutmelding :?. Dit is als ik het programma gewoon draai.

Echter, als ik vanuit de Delphi IDE het programma start, en dan op de bewuste plek aankom geeft Delphi wel de exception aan (in de IDE), maar als ik daarna weer op run klik, krijg ik weer niets te zien (buiten de IDE), terwijl je dan meestal een dialog box zou moeten zien.

Ik heb de volgende code in een thread procedure staan:
Delphi:
1
2
3
raise ETServer.Create('[ServerCore]: Could not stop server "'+
  FServer.Name+'". Please stop manually process "'+
  FServer.iConsStartFile+'".');

ETServer is een Exception class:
Delphi:
1
ETServer = class(Exception);
Buiten de thread heb ik dit probleem niet, dus ik vermoed dat het met de thread te maken heeft...

Weet iemand waarom ik geen dialog box te zien krijg, en hoe dit te fixen is?

[ Voor 4% gewijzigd door bgever op 24-12-2003 00:17 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Je kan in je thread die exceptie opvangen, en dan tonen:

code:
1
2
3
4
5
6
7
8
9
try
   
  // code that raises an exception
   
except
  on ETServer do begin
    MessageDlg ('Could not stop server', mtError, [mbOk], 0);
  end;
end;


Dan zou hij toch iets moeten tonen....

[ Voor 12% gewijzigd door whoami op 24-12-2003 01:01 ]

https://fgheysels.github.io/


  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
whoami schreef op 24 december 2003 @ 01:00:
Je kan in je thread die exceptie opvangen, en dan tonen
...
Ik heb het dan maar op die manier opgelost (ik gebruik liever de WinAPI omdat je dan een leuk *vommmm* geluidje hoort :P), hoewel het meer een workaround is.

Als iemand weet hoe ik zonder enige poespas (zelf dialog boxes maken) de dialog box van een exception kan laten zien hoor ik dat graag :).

  • klinz
  • Registratie: Maart 2002
  • Laatst online: 21-05 09:01

klinz

weet van NIETS

Er staat een artikeltje op de borland site over het hoe en waarom.

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
klinz schreef op 24 december 2003 @ 02:20:
Er staat een artikeltje op de borland site over het hoe en waarom.
Thnx,
Ik kan het op twee manieren oplossen:

1. Op de plek waar de error geplaatst moet worden zet je de volgende code neer:
Delphi:
1
2
3
Application.ShowException(ETServer.Create('[ServerCore]: Could not '+
'stop server "'+FServer.Name+'". Please stop manually process "'+
FServer.iConsStartFile+'".'));

2. Je gebruikt een try/except block om de hele execute methode in de Thread, raised op de normale manier je error, maar in het try/except block vang je deze op en laat je 'm zo aan de gebruiker zien:
Delphi:
1
2
3
4
5
6
7
8
procedure TMyThread.Execute;
begin
  try
    //hier je code die eventueel een exception raised
  except
    on e: Exception do Application.ShowException(e);
  end;
end;

Bij het laatste kun je ook kiezen voor een methode uit SysUtils, maar dan krijg je een fixed error string voor je eigen msg.

Ik ben er nog niet uit wat nu de beste manier is, de eerste is het gemakkelijkst, maar ik denk dat de tweede beter is, omdat je de error dan ook raised (de IDE merkt 'm dan wel op)... Of dat dus veel verschil uit maakt weet ik niet (mijn delphi kennis is daarvoor te klein) dus als iemand dat zou kunnen uitleggen zou ik dat erg fijn vinden...

[ Voor 4% gewijzigd door bgever op 24-12-2003 02:48 . Reden: GoT layout fixed ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Zoals in het artikel van klinz te lezen valt is jouw manier niet geheel correct. Je moet ook nog synchronizeren met de mainthread anders heb je grote kans op fouten als je een exceptie krijgt in je thread. De VCL code is namelijk niet thread safe, dus vandaar de Synchronize.

Ik zou voor de 2e methode gaan. Je vangt dan alle excepties af en je krijgt ze ook nog in de IDE te zien. Je kan verder in je thread excepties gewoon gebruiken zoals je normaal ook zou doen.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1