[delphi] alle exceptions ignoren.

Pagina: 1
Acties:

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
In mijn noeste pogingen om het systeem wat stabielen te laten lijken, moet bij het afsluiten alle exception worden weggegooid. Ik weet dat dit zeer ongebruikelijk is, en dat me hiervoor eigelijk in de gevangenis mogen stoppen, maar op dit moment is er gewoon geen betere oplossing (en het past ook goed bij de rest van het systeem),

Ik heb al een eigen exception handler geinstalleerd bij de Application, en
SetErrorMode(SEM_FAILCRITICALERRORS + SEM_NOALIGNMENTFAULTEXCEPT + SEM_NOGPFAULTERRORBOX );
heb ik bij het afsluiten aangegeven, maar ik krijg nog steeds een 204 error. En die errorcodes op het inet vinden is trouwens naadje!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

Nou, dat valt heel erg best mee, want toen ik laatst een error moest afvangen voor een drive info tooltje van mij (stop een disk in drive a) had ik binnen 5 minuten een error handler in elkaar geknutseld met google.

Succes dus ;)

Stop uploading passwords to Github!


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Zoals ik al eerder zei, heb ik al wel een error handler aangemaakt. Maar toch krijg ik nog exceptions, die neit door mijn exception handler gepakt worden.

code:
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
TSilentExceptionHandler = class
public
   procedure HandlerProc(Sender: TObject; EInstance: Exception);
end;

procedure TSilentExceptionHandler.HandlerProc(Sender: TObject; EInstance: Exception);
begin
   ShowMessage('SilentExceptionHandler used ');
end;
   
procedure TFeitenForm.MenuEindeClick(Sender: TObject);
var
  silentExceptionHandler: TSilentExceptionHandler;
  k:integer;
begin
  ShowMessage('sluitproject called');
  silentExceptionHandler:=TSilentExceptionHandler.Create();
  Application.OnException:=silentExceptionHandler.HandlerProc;
  ShowMessage('silent exceptionhandler installed');
  SetErrorMode(SEM_FAILCRITICALERRORS +
        SEM_NOALIGNMENTFAULTEXCEPT  + 
        SEM_NOGPFAULTERRORBOX   );
  SluitProject;
  Close;
end;

[ Voor 15% gewijzigd door Alarmnummer op 17-02-2003 12:07 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Waarom die SetErrorMode precies? Zonder dat zou ie ook gewoon al alle excepties moeten afvangen.

Delphi error 204? Is gewoon in de help te vinden onder error codes (fatal).
204 Invalid pointer operation EInvalidPointer
maar aangezien Delphi een default exception handler heeft zou ie altijd een nette exceptie melding moeten geven en niet een 204 laten zien. Dat zou betekenen dat er iets mis is met de exception handler. Misschien gebruik je DLL's, Threads of Sharemem?

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


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik gebruik een dll, en sharemem staat idd ook ergens tussen de uses. Deze exception komt dus niet van delphi, maar van de dll?

*is geen delphi/c progger, dus ook niet thuis in alle ins en outs ervan*

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Staat die sharemem unit wel als aller aller eerste in de uses van beide projecten? In de .dpr dus bovenaan...

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


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
In delphi staat dit:
delphi: ShareMem, MemCheck, HPMM, MultiMM

Maar die dll is gemaakt in c.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Daar staat ook ShareMem neem ik aan, anders heeft het geen nut en doet het meer schade als goed.

Excepties in DLLs worden niet doorgestuurd naar de App. Bovendien hebben DLLs hun eigen Application (of helemaal niet) en roepen dus niet jouw Application.OnExecute aan. Je zou de Application pointer of alleen de OnExecute door kunnen geven aan je DLL, maar beter is al je excpeties in de DLL zelf af te vangen en via een error code door te sturen.

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


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
In die dpr staat Sharemm nu ook bovenaan (eerst stond sysutils boven aan)

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
ShareMem is volgens mij alleen nodig als je delphi-strings wilt gebruiken naar een dll (Dll in C++ builder gemaakt?).

Wanneer treed de exception precies op? Als ik het goed begrepen heb bij het afsluiten van de applicatie. Op dat moment wordt je Application-object ook 'gestopt' en ik kan me zo voorstellen dat de exception-handler ook vrijgegeven wordt. Probeer eens het volgende in je projectfile:
code:
1
2
3
4
5
6
7
try
  Application.Run;
Except
  on E: Exception do begin
    ShowMessage('Foutje! ' + E.Message);
  end;
end;

Nu hoop ik alleen wel dat ik in de goede richting zit te denken :)

[ Voor 4% gewijzigd door Elissen op 17-02-2003 13:00 . Reden: Waar de code moet ]


  • jopiek
  • Registratie: September 2000
  • Laatst online: 30-03 18:57

jopiek

Tja... 'ns ff denken.

zie het voorbeeld voor de ApplicationException in de help!

onder OnException, ShowException, Terminate example

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//In addition to displaying the exception message, which happens by default, the 
//following code shuts down the application when an exception is not caught and handled.

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := AppException;

end;

procedure TForm1.AppException(Sender: TObject; E: Exception);

begin
  Application.ShowException(E);
  Application.Terminate;
  (*
    als je deze regels weg zou laten dan gebeurt er voor de applicatie met 
    form1 als mainform dus gewoon lekker niets 
  *)
end;

[ Voor 17% gewijzigd door jopiek op 17-02-2003 13:02 . Reden: aanvulling ]

Cogito Ergo Credo


Verwijderd

Hoewel dit geen direct antwoord is op je vraag, in de RX component set zit een component AppEvents.
Deze heeft het event onExeption, wat (dus) de errors afvangt.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Jongens, Jongens, lees eerst de hele thread aub! Dit heeft Alarmnummer al! Zijn probleem is dat er alsnog excepties doorglippen.

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


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Idd, ik moet proberen om die exceptions bij die dll de nek om te draaien. Ik zou alleen bij god niet weten hoe ik dat moet aanpakken.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

try..catch om al je dll functies in de dll. Als het een BCB dll met TForm's is zou je de Application nog kunnen doorlussen

[ Voor 6% gewijzigd door LordLarry op 17-02-2003 13:12 ]

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


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Alarmnummer, het kan natuurlijk zijn dat ik er helemaal langs zit, maar ik snap ff niet waarom je jouw exceptionhandler alleen gebruikt in de MenuEindeClick-event. Waarom stel je bij het initialiseren van je applicatie niet al jouw exceptionhandler als exceptionhandler in? Volgens mij valt je handler namelijk buiten zijn scope als de fout zich voordat bij het releasen van de dll (en dus BUITEN jouw onclick...?)

[ Voor 1% gewijzigd door OZ-Gump op 17-02-2003 13:13 . Reden: leer typen ... ! ]

My personal website


  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
Als het run-time errors zijn, die krijg je als er exceptions optreden in een initialization en finalization sectie optreden. Wellicht helpt dat bij het zoeken.
Trouwens, link je je dll's statisch of dynamisch?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Die exceptionhandler die ik daarin plak die blijft buiten de scoop van die buttonclick actief. En ik gebruik hem aan het einde, omdat ik alle foutmeldingen die ik aan het einde tegenkom, wil negeren. (Ook al is het een stopDezePcOnmiddelijkAndersVergaatDeWereldException)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Elissen schreef op 17 February 2003 @ 13:14:
Als het run-time errors zijn, die krijg je als er exceptions optreden in een initialization en finalization sectie optreden. Wellicht helpt dat bij het zoeken.
Trouwens, link je je dll's statisch of dynamisch?
Uhhh.. ik laad die dll in, dus ik neem aan dynamisch. Ik heb deze software (lees bagger) niet geschreven, maar ik moet het probleem nog stabiel te proberen te krijgen voor het einde van deze week. (Is trouwens al voor 90% gelukt, crashed niet meer zo vaak als eerst.. nu pas na 10 min een error) :D

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TFeitenForm.MenuEindeClick(Sender: TObject);
var
  silentExceptionHandler: TSilentExceptionHandler;
  k:integer;
begin
  ShowMessage('sluitproject called');
  silentExceptionHandler:=TSilentExceptionHandler.Create();
  Application.OnException:=silentExceptionHandler.HandlerProc;
  ShowMessage('silent exceptionhandler installed');
  SetErrorMode(SEM_FAILCRITICALERRORS +
        SEM_NOALIGNMENTFAULTEXCEPT  + 
        SEM_NOGPFAULTERRORBOX   );
  SluitProject;
  Close;
end;
Hier lijkt het me toch echt dat de variabele silentExceptionHandler die je hier create gekilled wordt op het moment dat deze procedure voorbij is. Zou je voor mij die variabele eens globaal willen maken? Ook al zet je hem daar pas, da's 't probleem niet. Ik denk namelijk dat 'ie gekilled wordt...
Oeh wat ben ik eigenwijs :P

My personal website


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Waar staat de Free dan? Het is geen interface en Delphi heeft geen garbage collection...

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


  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
Uhhh.. ik laad die dll in, dus ik neem aan dynamisch. Ik heb deze software (lees bagger) niet geschreven, maar ik moet het probleem nog stabiel te proberen te krijgen voor het einde van deze week. (Is trouwens al voor 90% gelukt, crashed niet meer zo vaak als eerst.. nu pas na 10 min een error) :D
:D
Dynamisch: LoadLibary('dllnaam.dll'); en FreeLibary(handletje);
Statisch: procedure abc; external 'dllnaam.dll';

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
dynamisch dus, want zie wel een loadlibrary staan.

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
Dan zouden je exceptions op moeten treden bij de freelibary. Als die er niet in staan geeft windows alles vrij als het process beeindigd wordt. Dan heb je iid geen controle meer over de exceptions. Probeer dan eens een freelibary tussen try..excepts.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ok, ik heb het tussen try catch blokken geplaatst. Nu maar hopen dat het minder vaak crashed. Ik kan het namelijk ook niet echt testen omdat het crashen zo nu en dan gebeurd :) Althans deze crash :D

mooi stukje code.

de dummy ruimte is een stuk geheugen waarin andere pointers per ongeluk schrijven. Hierdoor raakt het dummygeheugen besmet, maar dat is beter dan geheugen dat wel nuttig is.
code:
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
boolean db_init(const char *DSN, const char *ESMDEF)
{

 int i;

  dummyruimte=Alloc(1024);

  i=read_esm_def(ESMDEF);

log_to_file("\n");
log_to_file("db_init");

  #ifdef DB_DEBUG
     fd=fopen("C:\\DBLIB.BAK","w");
     fprintf(fd,"\n---------- DBLIB.C debug bestand ----------\n");
     fclose(fd);
  #endif


  // Wijziging:
//    reconstruct();



  if (i!=0) return False;
//  if (read_esm_def(ESMDEF)!=0) return False;

  make_preselection_list();

  if (ODBCConnect(DSN)!= 0) return False;  // Als ODBCConnect is mislukt.

  return TRUE;                             // Als het wel gelukt is.
}


Oja. En bij odbc errors in de c code, krijg je vanuit de dll een dialoog te zien met een mooie foutmelding. Maar ik krijg geen exception of een errorflag ofzo. Je kan dus niet zien dat er iets is misgegaan. (Met als gevolg dat je dus doorgaat met iets wat niet kan) |:(

[ Voor 93% gewijzigd door Alarmnummer op 17-02-2003 14:27 ]


  • jopiek
  • Registratie: September 2000
  • Laatst online: 30-03 18:57

jopiek

Tja... 'ns ff denken.

LordLarry schreef op 17 februari 2003 @ 13:08:
Jongens, Jongens, lees eerst de hele thread aub! Dit heeft Alarmnummer al! Zijn probleem is dat er alsnog excepties doorglippen.
excuus, lezen is idd een vak apart ;)

Cogito Ergo Credo

Pagina: 1