Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 异常由TNMPOP3.Connect生成两次_Delphi_Ssl_Pop3_Email Client_Delphi 6 - Fatal编程技术网

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派生的异常,这就是为什么您能够看到类名及其消息。一旦调试器处理完异常,它将被传递回应用程序进行进一步处理。当应用程序处理它时,会引发另一个异常,调试器会显示该异常,然后将其传递回应用程序。