2014-09-21 2 views
0

Il y a longtemps que j'écrit le code suivant pour récupérer des courriels de boîte aux lettres:Exception est générée deux fois par TNMPOP3.Connect

pop3 := TNMPOP3.Create(Self); 
try 
    pop3.Host := FAppSettings.ServerName; 
    pop3.Port := FAppSettings.ServerPort; 
    pop3.UserID := FAppSettings.Login; 
    pop3.Password := FAppSettings.Password; 
    try 
    pop3.Connect; 
    except 
    on E:Exception do AddError(E.Message); 
    end; 
    if not pop3.Connected then Exit; 
    if pop3.MailCount > 0 then begin 
    pop3.DeleteOnRead := False; 
    pop3.AttachFilePath := GetTempDirectory; 
    ProcessMsgs(pop3); 
    end 
    else begin 
    TCommon.InfMsg('There are no messages in mailbox'); 
    end; 
    pop3.Disconnect; 
finally 
    pop3.Free; 
end; 

Maintenant, lorsque le fournisseur de service de messagerie commuté entièrement SSL ce code ne évidemment, mais dans un étrange way:

pop3.Connect ligne provoque une exception mais avec un texte vide dans E.Message rendant le problème peu clair pour l'utilisateur final.

enquête du problème dans débogueur Delphi révèle que la première fois la bonne exception est générée:

projet .... soulevé exception classe Exception avec le message «Echec de l'authentification.

mais, quand j'appuyez sur F8 (Step Over) à nouveau, le point d'exécution reste dans la même ligne et une autre exception est générée:

projet .... soulevé classe exception Exception avec le message ' '.

et seule cette exception est interceptée par try-except.

Pourquoi?

+0

Regardez le code de 'TNMPOP3' la raison devrait être là –

+0

@Sir Rufo: Je n'ai pas de code source pour' TNMPOP3' – Paul

+3

Après quelques recherches, il semble que les composants de FastNet sont un peu bogués (amical parlé) et vous devriez penser à utiliser une bibliothèque différente. En raison de Delphi 6 regarder http://synapse.ararat.cz –

Répondre

2

Pour répondre à votre question actuelle de «pourquoi?», La séquence que vous décrivez signifie que TNMPOP3.Connect() intercepte en interne l'exception d'authentification d'origine et lève une nouvelle exception sans message d'erreur. Que ce soit un bug ou intentionnel, il n'y a aucun moyen de savoir sans regarder le code source pour TNMPOP3. Delphi n'est pas livré avec ce code source, et NetMasters n'est plus disponible, vous ne pouvez donc pas le demander. TNMPOP3 ne prend pas en charge SSL de toute façon, vous devrez donc passer à un autre composant/bibliothèque pour gérer votre fonctionnalité POP3 + SSL aller de l'avant.

+0

Jamais su que Delphi est capable de creuser dans les exceptions internes d'un code fermé sans avoir de sources =/ – Paul

+0

Ce n'est pas. Ce que vous avez décrit se passe pendant que votre application s'exécute dans le débogueur de l'EDI. Lorsqu'une exception est déclenchée, le système d'exploitation transmet d'abord l'exception au débogueur, pas l'application. Le débogueur de Delphi sait comment afficher les exceptions dérivées de 'SysUtils.Exception', ce qui explique pourquoi vous pouvez voir le nom de la classe et son message. Une fois que le débogueur est terminé avec l'exception, il est renvoyé à l'application pour un traitement ultérieur. Pendant le traitement de l'application, une autre exception est levée, que le débogueur affiche et renvoie ensuite à l'application. –

Questions connexes