2013-07-29 1 views
-1

Я использую D5 и Synaps с OpenSSL, и он отлично работает. Я пытаюсь справиться с авариями, поэтому сознательно ввел плохие данные, по одной попытке. До сих пор я обрабатывал вызванные сбои в порядке, но я только что изменил пароль для входа и попытался войти в систему.Исключение, вызывающее скачок в коде

gMajorFail:=False; 
if not pop3.Login() then 
begin 
    gMajorFail:=True; 
    raise EPOP3.Create('POP3 ERROR: '+IntToStr(pop3.Sock.LastError)+ 
        ' When trying to Login to Account'); 
end; 
if gMajorFail then GoTo HadFailure; 

Вместо того, чтобы прыгать на HadFailure-Label, он переходит к последней строке кода в процедуре.

Я попытался использовать Try/finally (именно поэтому я использую Label to GoTo), но он по-прежнему пропускает право до последней строки кода.

Где я ошибаюсь и как я могу это исправить?

Благодаря

+2

Почему вы вообще вызвали исключение? –

+0

После прыжка до последней строки ... она вернется туда, где она должна быть? У меня было это поведение при отладке ocx в D2007. Кажется, это «нормально». – Sherlock70

+0

@DavidHeffernan Мне тоже было интересно, но я боялся спросить. –

ответ

14

о мальчик ... убить этого GoTo с огнем.

При этом, когда вы поднимаете исключение, которое является концом строки, оно не возвращает управление остальной части вашего метода - выполнение немедленно передается обработчику исключений (то есть: инициируется ближайший родительский блок except/finally или , если он не существует, вы получаете диалоговое окно «необработанное исключение»). Когда вы поднимаете исключение, вы по существу бросаете свои руки и предполагаете, что это означает, что ваш собственный код не имеет дополнительной обработки ошибок, которая может исправить проблему и что вам больше нечего делать. Если вам нужно очистить или иным образом установить некоторые оставшиеся вещи, сделайте все это сначала, а затем поднимите исключение в качестве последнего, что вы делаете.

От the documentation:

Когда возбуждается исключение - то есть ссылка в рейзе заявлении - это регулируется специальной обработкой исключений логики. Оператор raise никогда не возвращает управление обычным способом. Вместо этого он передает управление самому внутреннему обработчику исключений, который может обрабатывать исключения данного класса. (Самый внутренний обработчик - тот, у которого попробуйте ... кроме того, что блок был недавно введен, но еще не вышел.)

+4

+1 для объединения слов GOTO и FIRE :) – whosrdaddy

+0

@J ... Вернитесь на Ковчег и возьмите с собой. :) Если это действительная часть языка, то нет причин не использовать ее. Кроме того, GoTo был добавлен, чтобы помочь справиться с этим исключением. Я считаю, что при тестировании неудачи, и я предполагаю, что вы проверяете ее, а также успех, справедливая игра использует все, что требуется. Итак, нет полезных ответов, а? Я нажал кнопку «Справка» и прочитал ее, но никогда не предлагал, как «обрабатывать исключение», о чем я прошу. Дэвид ближе всего подходит, «зачем поднять?» и я попытаюсь удалить это и перейти оттуда. – user2175495

+0

Собственно, это 'goto', который я удалю. Я спросил: «Почему рейз?» так как нет смысла смешивать две модели обработки ошибок. Фактически 'goto' может быть полезен на языках без исключений для обработки ошибок. Например, вы найдете все это через исходный код для всех современных операционных систем. –