2014-09-21 8 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 этот код не очевидно, но как-то странно путь:

строка вызывает исключение, но с пустым текстом в E.Message, что делает проблему непонятной для конечного пользователя.

Исследование задачи в Delphi отладчик показывает, что первый раз право генерируется исключение:

Project .... поднятый исключение класса Exception с сообщением «Ошибка аутентификации».

, но потом, когда я нажимаю F8 (Step Over) еще раз, точка выполнения остается в той же строке, а другое генерируется исключение:

Project .... поднятое исключение класса Exception с сообщением ' ».

и только это исключение улавливается try-except.

Почему?

+0

Посмотрите на код 'TNMPOP3', причина должна быть там –

+0

@Sir Rufo: У меня нет исходного кода для' TNMPOP3' – Paul

+3

. После некоторого поиска в Google кажется, что компоненты FastNet немного багги (дружеские разговоры), и вы должны подумать об использовании другой библиотеки. Из-за Delphi 6 взгляните на http://synapse.ararat.cz –

ответ

2

Чтобы ответить на ваш реальный вопрос «почему?», Описанная вами последовательность означает, что TNMPOP3.Connect() внутренне ломает исходное исключение аутентификации и бросает новое исключение без сообщения об ошибке. Является ли это ошибкой или преднамеренным, нет никакого способа узнать, не глядя на исходный код для TNMPOP3. Delphi не поставлял с этим исходным кодом, а NetMasters больше нет, поэтому вы не можете их просить. TNMPOP3 не поддерживает SSL в любом случае, поэтому вам придется переключиться на другой компонент/библиотеку, чтобы обрабатывать ваши функции POP3 + SSL, продвигаясь вперед.

+0

Никогда не знал, что Delphi может выкопать внутренние исключения из закрытого кода без источников =/ – Paul

+0

Это не так. То, что вы описали, происходит во время работы вашего приложения внутри отладчика IDE. Когда возникает исключение, ОС сначала передает исключение из отладчика, а не приложение. Отладчик Delphi знает, как отображать исключения, полученные из 'SysUtils.Exception', поэтому вы можете увидеть имя класса и его сообщение. Как только отладчик выполняется с исключением, он возвращается в приложение для дальнейшей обработки. Пока приложение обрабатывает его, возникает еще одно исключение, которое отображает отладчик, и затем переход обратно в приложение. –