Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 675

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Блок Try finally, если использовать в файле проекта приводит в случае исключения к падению программык падению. С предложением отправить отчёт об ошибке в Microsoft :D . С except'ом всё ОК проходит. Почему так?

Knjazev Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Knjazev (статус: 3-ий класс)
Вопрос отправлен: 28 июня 2007, 20:48
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Здравствуйте, Ласковый 3лоумышленник!
Вообще-то если в try...finally происходит исключительная ситуация, то она не "гасится", как в случае с try...except. Соответственно, блок finally...end предназначен для выполнения каких-либо действий даже если исключительная ситуация возникла. А вот почему предлагается отправить отчет в MS - непонятно... По идее обычное сообщение об ошибке должно появляться.

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 28 июня 2007, 22:29

Ответ #2. Отвечает эксперт: min@y™

Скомпилил я твой пример. Интересный случай. Из-под отладчика работает, как надо. А без него действительно при делении на 0 винда грохает процесс. Кстати, это происходит не только в случае, когда исключение EDivisionByZero происходит в файле проекта. Я сделал отдельный модуль и поместил туда твой код. То же самое - так и хотелось нажать кнопку "Отправить". :)) Спецы из MS призадумались бы и впали в ступор. :))

Юзай конструкцию типа:
try

try

except

end;

finally

end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 29 июня 2007, 10:19

Ответ #3. Отвечает эксперт: Лукьяненко Алексей Валериевич

Здравствуйте, Knjazev!

Блок try-finally-end педназначен для обязательного выполнения некоторых действий, вне зависимости от того, была ли какая-то ошибка. Никакой обработки самой ошибки при этом не происходит.
А блок try-except-end выполняет часть except в случае ошибки, и гасит ее.
В Вашем случае Вы покажете окно с сообщением, а потом программа должна вылететь, так как ошибку Вы не обработали.

Ответ отправил: Лукьяненко Алексей Валериевич (статус: 1-ый класс)
Время отправки: 2 июля 2007, 11:21


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 2 июля 2007, 20:24; участников в обсуждении: 4.
Knjazev

Knjazev (статус: 3-ий класс), 28 июня 2007, 22:56 [#1]:

2 Косолапов Дмитрий Юрьевич "А вот почему предлагается отправить отчет в MS - непонятно..."
Вы не поняли. Прога отваливается. Хотя не должна.
min@y™

min@y™ (статус: Доктор наук), 29 июня 2007, 08:22 [#2]:

Давай код DPR-файла в студию. Глянем, что там у тебя.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Knjazev

Knjazev (статус: 3-ий класс), 29 июня 2007, 09:20 [#3]:

program Project1;

uses
Windows, SysUtils;

var
i: Integer;
begin
i := 0;
try
i := 1 div i;
MessageBox(0,PChar(IntToStr(i)),':-)',MB_OK);
finally
MessageBox(0,'Hello, min@y™!!!',':-)',MB_OK);
end;
end.
Knjazev

Knjazev (статус: 3-ий класс), 2 июля 2007, 18:36 [#4]:

2 Лукьяненко Алексей Валериевич: я в except ничего не гашу (ошибку), но прога не вылетает.
Лукьяненко Алексей Валериевич

Лукьяненко Алексей Валериевич (статус: 1-ый класс), 2 июля 2007, 18:56 [#5]:

блок except сам по себе гасит ошибку.
то есть если написать
try
i := 1 div 0;
except
end;

то ошибки не будет. В этом блоке Вы можете намеренно снова вызвать исключение при помощи оператора raise, а вот погасить исключение в блоке finally невозможно.

Еще раз.
код из блока finally конструкции try-finally-end выполнится всегда, а если была ошибка - после него будет исключение
код из блока except констркуции try-except-end выполняется только когда произошло исключение в блоке try
Knjazev

Knjazev (статус: 3-ий класс), 2 июля 2007, 19:06 [#6]:

Алексей, поставте цикл на 10000, с finally вылетит сразу, а с except нет. В "обычном" проекте finally без проблем используется (в модуле формы, например), а вот в таких проектах - нет. ЗЫ как работают try-finally-end, try-except-end я знаю.
Knjazev

Knjazev (статус: 3-ий класс), 2 июля 2007, 19:08 [#7]:

Другими словами, почему raise вырубает прогу, если вызвывается в файле проекта? С предложением написать в Майкрософт.
Вадим К

Вадим К (статус: Академик), 2 июля 2007, 19:33 [#8]:

очень просто. все обработчики кнопок и прочей лабуды уже по умолчанию обрамлены в невидимыее try except. а вот в project.dpr между begin end - нет. поэтому здесь, если не поставить обработку исключений, то оно и вылетает. В приложениях на С++ от майкрософтовского компилятора проблема таже. там всегда вылетает.
Галочка "подтверждения прочтения" - вселенское зло.
Knjazev

Knjazev (статус: 3-ий класс), 2 июля 2007, 20:24 [#9]:

2 Вадим К: теперь стало немного понятнее

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.02 сек.