2014-09-21 39 views
0

很久以前我写了下面的代码从邮箱收取邮件:异常是由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; 

现在,当邮件服务提供商完全切换到SSL验证码明明失败了,但在一个陌生的方式:

pop3.Connect行会导致一个异常,但在E.Message中有一个空文本,使得最终用户不清楚该问题。在Delphi调试器的问题

调查显示,在第一时间产生正确的异常:

工程....有消息引发的异常类异常“验证失败”。

但然后,当我按F8(步过)再次,执行点保持在相同的线上,并产生另一异常:

项目....提出异常类异常处理消息“ ”。

只有这个例外被try-except捕获。

为什么?

+0

看看'TNMPOP3'的代码,原因应该在那里 – 2014-09-21 07:11:27

+0

@Sir Rufo:我没有'TNMPOP3'的源代码 – Paul 2014-09-21 07:20:32

+3

经过一些Google搜索后,似乎FastNet的组件有点儿bug ),你应该考虑使用不同的库。因为Delphi 6请看http://synapse.ararat.cz – 2014-09-21 07:23:00

回答

2

要回答你“为什么?”的实际问题,你描述的序列意味着TNMPOP3.Connect()在内部捕获原始认证异常并抛出一个没有错误信息的新异常。无论这是一个错误还是故意的,没有查看TNMPOP3的源代码,就无法知道。德尔福没有附带该源代码,并且NetMasters不在身边,所以你不能要求它。 TNMPOP3不管怎样都不支持SSL,所以您将不得不切换到另一个组件/库来处理您前进的POP3 + SSL功能。

+0

从来不知道Delphi能够深入挖掘一个封闭代码的内部异常,而无需消息源=/ – Paul 2014-09-22 12:04:13

+0

事实并非如此。您所描述的是在您的应用在IDE调试器内运行时发生的。当引发异常时,OS首先将异常传递给调试器,而不是应用程序。 Delphi的调试器知道如何显示从'SysUtils.Exception'派生的异常,这就是为什么你能够看到类名和它的消息。一旦调试器完成了异常,它将被传回给应用程序进行进一步处理。当应用程序正在处理它时,另一个异常正在引发,调试器正在显示,然后传回应用程序。 – 2014-09-22 16:00:35