| 
| 
 | Вопрос # 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 Вадим К: теперь стало немного понятнее |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |