[Delphi] Try...Except vangt m'n exception niet op

Pagina: 1
Acties:
  • 109 views sinds 30-01-2008
  • Reageer

  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
Ik heb een procedure geschreven dat volledig in een try...except blok is geschreven, dus juist na de begin, en juist voor de end;

In die procedure wordt een POP3-client gecreëerd (TIdPOP3, waarschijnlijk wel bekend bij sommigen onder jullie 8)), de data ingevuld, geconnect, en gekeken of de connection successful was, om zo te weten of de data correct is of niet.

Hier is (deels) de code:

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
34
35
36
37
38
39
40
41
42
43
44
45
//Test the account in "Account", mainly for testing purposes before saving
function TMailChecker.TestAccount(Account: TAccount): TError;
begin
  try
    case Account.AccountType of
      atPOP3: begin
        if POP3Client = nil then
          POP3Client := TIdPOP3.Create(nil);

        with POP3Client do
        begin
         // try
            Host := Account.AccountServer;
            Port := Account.AccountPort;

            Username := Account.AccountUsername;
            Password := Account.AccountPassword;

            Connect(Account.AccountTimeout);

            if not Connected then
            begin
              result := Errors.NewError('Unable to connect. Please check if you entered the right username, password, host and port and try again.', Error_NoConnection);
              POP3Client.Free;
            end

            else
            begin
              result := Error_None;
              POP3Client.Free;
            end;
         // except
         // end;
        end;
      end;

      atIMAP4: begin
       // Weggelaten
      end;
    end;
  except
    on RaisedException: Exception do
     result := Errors.NewError(RaisedException.Message, Error_Unknown);
  end;
end;



Het probleem: als de data niet correct is, geeft hij toch een (raadselachtige) error/exception (hij doet dit niet als de data wel correct is, dus als hij volledig kan connecten en auth'en). In de comments zie je dat ik een tweede try...except blok heb geprobeert, en als ik die daar zet (dus als ik de slashes weghaal), word de error niet gerezen. Hoe komt dit?

Ik heb al gedacht aan het feit dat de exception niet van het type "Exception" is, maar ik dacht toch dat "Exception" gebruikt kan worden om alle exceptions op te vangen? Ik heb wat gegoogled hierover en niets gevonden :(.

Kan iemand mij help met dit? Thanks :*)

If you come here... you'll find me... I promise


  • Osiris
  • Registratie: Januari 2000
  • Niet online
Volgens mij moet je nog een DoNothing; toevoegen ofzo...

Althans, dat staat mij bij..


edit:
Volgens mij sloeg dat nergens op :X

[ Voor 24% gewijzigd door Osiris op 10-02-2003 21:44 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je weet dat als je aan het debuggen bent in de IDE alle excepties langskomen? Afgevangen of niet. Heb je het ook als je het buiten de IDE probeert?

Idd, alle excepties horen van Exception af te leiden.

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


  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
LordLarry schreef op 10 February 2003 @ 21:45:
Je weet dat als je aan het debuggen bent in de IDE alle excepties langskomen? Afgevangen of niet. Heb je het ook als je het buiten de IDE probeert?

Idd, alle excepties horen van Exception af te leiden.
Even proberen, maar hoe komt het dan dat hij geen exception geeft als ik die 2de try...except blok er zet?


Osiris: idd, ik was me al aan het afvragen wat je bedoelde 8)7


edit:
LordLarry: heb het geprobeert, maar dan gebeurt juist hetzelfde |:(

[ Voor 9% gewijzigd door Relix op 10-02-2003 21:50 ]

If you come here... you'll find me... I promise


  • Osiris
  • Registratie: Januari 2000
  • Niet online
Relix schreef op 10 februari 2003 @ 21:47:
[...]

Osiris: idd, ik was me al aan het afvragen wat je bedoelde 8)7
Nou, ik bedoelde eigenlijk dat als ik exceptions niet wilde (bijvoorbeeld Connection Reset By Peer ofzo), dan deed ik dus dat try en except enzo, alleen als ik nix zette dussen de exept en end;, dan bleef ie het toch doen... :/ Pas zodra ik DoNothing; oid ertussenin zette, dan gaf ie geen exceptions meer...

Alleen dit is dus niet nuttig voor dit topic :X En volgens mij al helemaal niet goed coden ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
Relix schreef op 10 February 2003 @ 21:47:
[...]

edit:
LordLarry: heb het geprobeert, maar dan gebeurt juist hetzelfde |:(


Zeer vreemd.... als die exceptie daadwerkelijk van Exception afgeleid is, moet die gewoon opgevangen worden....

Dus, als je uw programma runt buiten de Delphi IDE (dus, gewoon starten vanuit Windows Explorer bv), dan krijg je die exceptie, en wordt je except niet afgehandeld?

https://fgheysels.github.io/


  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
Osiris schreef op 10 February 2003 @ 21:53:
[...]

Nou, ik bedoelde eigenlijk dat als ik exceptions niet wilde (bijvoorbeeld Connection Reset By Peer ofzo), dan deed ik dus dat try en except enzo, alleen als ik nix zette dussen de exept en end;, dan bleef ie het toch doen... :/ Pas zodra ik DoNothing; oid ertussenin zette, dan gaf ie geen exceptions meer...

Alleen dit is dus niet nuttig voor dit topic :X En volgens mij al helemaal niet goed coden ;)
lol, wel, bij mij werkt het toch (bij de 2de try...except blok ving hij de exception op >:) ), en zou het in jouw geval niet gewoon makkelijker zijn om een ";" te zetten? dat is volgens mij ook wel gelijk aan "iets" en toch "niets" :9.

If you come here... you'll find me... I promise


  • Osiris
  • Registratie: Januari 2000
  • Niet online
Relix schreef op 10 February 2003 @ 21:57:
[...]


lol, wel, bij mij werkt het toch (bij de 2de try...except blok ving hij de exception op >:) ), en zou het in jouw geval niet gewoon makkelijker zijn om een ";" te zetten? dat is volgens mij ook wel gelijk aan "iets" en toch "niets" :9.
Joahjoah, maar je moet in je eigen topic niet te offtopic gaan joh ;)

  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
whoami schreef op 10 februari 2003 @ 21:56:

[...]


Zeer vreemd.... als die exceptie daadwerkelijk van Exception afgeleid is, moet die gewoon opgevangen worden....

Dus, als je uw programma runt buiten de Delphi IDE (dus, gewoon starten vanuit Windows Explorer bv), dan krijg je die exceptie, en wordt je except niet afgehandeld?
Ja, erg é? In de help even gekeken, en daar staat ook dat als er een exceptie voorkomt, word de verbinding verbroken en de exception ge-re-raised, deze laatste zou dan opgevangen moeten worden door die try...except volgens mij...

Nou ja, zo erg is het ook niet, ik kan daar wel een tweede try...except zetten, maar het is natuurlijk errreug interesant om te weten waarom

If you come here... you'll find me... I promise


  • Night-Reveller
  • Registratie: September 2000
  • Laatst online: 23-08 22:29
Weet je zeker dat het van type Exception is? Wat is de Error precies?

Bovendien kan je in een except ook een else statement plaatsen:
code:
1
2
3
4
5
6
7
8
9
except
  On E:Exception do 
  begin
     // bla
  end
  else
  begin
    //bla
  end

  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
ik voel me dus nu echt idioot! Argh! Ik had gewoon het object "Errors" niet gecreate! Ik dacht dat hij nooit in het "except"-deel kwam omdat hij her niet voorbijging met F8 (step over)...

Dus, bedankt voor jullie hulp, en het spijt me dat ik jullie heb beziggehouden... :( ...maar het werkt, en dat is al iets :)

If you come here... you'll find me... I promise


  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

er is een trucje om de onexcept clause helemaal af te vangen zie onexception example in help... tcp/ip spul doet vaak vaag...

Cogito Ergo Credo


  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
thx, maar hier is het makkelijker om gebruik te maken van try...except, anders kan ik niet "linear" programmeren of hoe dat ook noemt...


een bijvraag mischien: hoe weet ik welk type exception er geraised is? Ik kan er een paar later raisen die ik beter zou willen afhandelen (met een betere beschrijving dan bv "Not Allowed" als pass/username niet correct is), maar ik weet niet welke het zijn en de help is ook niet erg informatief hierover...

If you come here... you'll find me... I promise


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 17:26

CyeZ

Vroem vroem!!!

Als je verschillende soorten exceptions hebt kun je met een dergelijke constructie voor verschillende exceptions verschillende afhandelings routines gebruiken:

Delphi:
1
2
3
4
5
6
7
8
try

 ...
except
  on E: EZeroDivide do HandleZeroDivide;
  on E: EOverflow do HandleOverflow;
  on E: EMathError do HandleMathError;
end;


Hiermee kun je vaak ook gedetaileerde exception informatie uitlezen als de standaard E.Message en E.Helpcontext.
Overigens kun je de 'E: ' ook weglaten, maar dan kun je niet zo makkelijk de informatie over de Exception uitlezen.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
ja dat weet ik, maar als ik niet weet welk type de exception is, hoe kom ik dit te weten? Ik bedoel, ik kan bv een verkeerd passwoord typen, en dan geeft em een exception, maar ik weet niet welk en ik zou hem graag opvangen op de manier die jij juist beschreven hebt

If you come here... you'll find me... I promise


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dat zegt de exceptie melding zelf al

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


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 20:22

Tomatoman

Fulltime prutser

Relix schreef op 13 February 2003 @ 12:45:
ja dat weet ik, maar als ik niet weet welk type de exception is, hoe kom ik dit te weten? Ik bedoel, ik kan bv een verkeerd passwoord typen, en dan geeft em een exception, maar ik weet niet welk en ik zou hem graag opvangen op de manier die jij juist beschreven hebt
Dat staat er toch in het voorbeeld van Cyez? Delphi loopt van boven naar beneden het lijstje door en zodra de fout van de bewuste class afstamt afstamt, wordt de code achter do uitgevoerd. Misschien toch maar eens F1 gebruiken :O? De class kun je trouwens bijzonder gemakkelijk achterhalen:
Delphi:
1
2
3
4
5
6
try
 ...
except
  on E: Exception do
      ShowMessage(E.ClassName);
end;

[ Voor 3% gewijzigd door Tomatoman op 13-02-2003 21:16 . Reden: spelfout ]

Een goede grap mag vrienden kosten.


  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

Topicstarter
Wel duh, lol, ik weet ook wel wat er in een except ... end; enzo gebeurt, ik vroeg me alleen af hoe de class-type van een exception te kunnen achterhalen, en jouw laatste code toont dat, dank u :)

If you come here... you'll find me... I promise


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

* LordLarry wordt weer genegeerd ;)

De exceptie message zelf zegt het al, je hoeft niet eens code te schrijven...

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


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Moet je niet ergens 'raise Exception' doen?? Anders heb je natuurlijk geen exception :)


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge

Pagina: 1