|
Вопрос # 675/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Блок Try finally, если использовать в файле проекта приводит в случае исключения к падению программык падению. С предложением отправить отчёт об ошибке в Microsoft :D . С except'ом всё ОК проходит. Почему так?
 |
Вопрос задал: Knjazev (статус: 3-ий класс)
Вопрос отправлен: 28 июня 2007, 20:48
Состояние вопроса: открыт, ответов: 3.
|
Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич
Здравствуйте, Ласковый 3лоумышленник!
Вообще-то если в try...finally происходит исключительная ситуация, то она не "гасится", как в случае с try...except. Соответственно, блок finally...end предназначен для выполнения каких-либо действий даже если исключительная ситуация возникла. А вот почему предлагается отправить отчет в MS - непонятно... По идее обычное сообщение об ошибке должно появляться.
Ответ #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 в случае ошибки, и гасит ее.
В Вашем случае Вы покажете окно с сообщением, а потом программа должна вылететь, так как ошибку Вы не обработали.
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 2 июля 2007, 20:24; участников в обсуждении: 4.
|
Knjazev (статус: 3-ий класс), 28 июня 2007, 22:56 [#1]:
2 Косолапов Дмитрий Юрьевич "А вот почему предлагается отправить отчет в MS - непонятно..."
Вы не поняли. Прога отваливается. Хотя не должна.
|
|
min@y™ (статус: Доктор наук), 29 июня 2007, 08:22 [#2]:
Давай код DPR-файла в студию. Глянем, что там у тебя.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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 (статус: 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 (статус: 3-ий класс), 2 июля 2007, 19:06 [#6]:
Алексей, поставте цикл на 10000, с finally вылетит сразу, а с except нет. В "обычном" проекте finally без проблем используется (в модуле формы, например), а вот в таких проектах - нет. ЗЫ как работают try-finally-end, try-except-end я знаю.
|
|
Knjazev (статус: 3-ий класс), 2 июля 2007, 19:08 [#7]:
Другими словами, почему raise вырубает прогу, если вызвывается в файле проекта? С предложением написать в Майкрософт.
|
|
Вадим К (статус: Академик), 2 июля 2007, 19:33 [#8]:
очень просто. все обработчики кнопок и прочей лабуды уже по умолчанию обрамлены в невидимыее try except. а вот в project.dpr между begin end - нет. поэтому здесь, если не поставить обработку исключений, то оно и вылетает. В приложениях на С++ от майкрософтовского компилятора проблема таже. там всегда вылетает.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Knjazev (статус: 3-ий класс), 2 июля 2007, 20:24 [#9]:
2 Вадим К: теперь стало немного понятнее
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|