Delphi 异常由TNMPOP3.Connect生成两次
很久以前,我编写了以下代码从邮箱检索电子邮件:Delphi 异常由TNMPOP3.Connect生成两次,delphi,ssl,pop3,email-client,delphi-6,Delphi,Ssl,Pop3,Email Client,Delphi 6,很久以前,我编写了以下代码从邮箱检索电子邮件: 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
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.消息中的文本为空,使最终用户不清楚问题
对Delphi debugger中的问题进行的调查显示,第一次生成正确的异常时:
项目。。。。引发异常类异常,消息为“身份验证失败”
但是,当我再次按F8(单步执行)时,执行点仍在同一行中,并生成另一个异常:
项目。。。。引发了异常类异常,消息为“”
只有这个异常被try except
捕获
为什么?要回答您的实际问题“为什么?”,您描述的顺序意味着
TNMPOP3.Connect()
正在内部捕获原始身份验证异常,并在没有错误消息的情况下抛出新异常。无论这是一个bug还是故意的,如果不查看TNMPOP3
的源代码,就无法知道。Delphi并没有附带那个源代码,而且网络管理员已经不在了,所以你们不能向他们索取TNMPOP3
无论如何都不支持SSL,因此,您必须切换到另一个组件/库来处理POP3+SSL功能。查看TNMPOP3
的代码,原因应在there@Sir鲁福:我没有TNMPOP3
的源代码,在谷歌搜索了一下之后,似乎FastNet组件有点问题(友好的交谈)你应该考虑使用不同的库。由于Delphi 6,look at从不知道Delphi能够在没有源代码的情况下挖掘封闭代码的内部异常=/事实并非如此。您所描述的是当您的应用程序在IDE的调试器中运行时发生的。引发异常时,操作系统首先将异常传递给调试器,而不是应用程序。Delphi的调试器知道如何显示从SysUtils.Exception派生的异常,这就是为什么您能够看到类名及其消息。一旦调试器处理完异常,它将被传递回应用程序进行进一步处理。当应用程序处理它时,会引发另一个异常,调试器会显示该异常,然后将其传递回应用程序。