Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

try{}__finally{}

295
15 января 2003 года
gray_k
356 / / 20.12.1999
Такой вопрос.
если я напишу такой код
code:
[COLOR=blue]
code:
try
{
//somecode
if(MyIf)
return;
}
__finally
{
//finallycode
}
return;
[/COLOR]
то при выполнении условия MyIf будет ли исполнен код finallycode
358
15 января 2003 года
moonmike
423 / / 18.10.2002
Цитата:
Originally posted by gray_k
Такой вопрос.
если я напишу такой код
code:
[COLOR=blue]
code:
try
{
//somecode
if(MyIf)
return;
}
__finally
{
//finallycode
}
return;
[/COLOR]
то при выполнении условия MyIf будет ли исполнен код finallycode


Насколько я С++ помню код заключенный в __finally исполняется в любом случае.А добавлен данный спецификатор для того чтобы не очишать память в нескольких местах.(То есть если у тя вылет по Эксцепшину то надо память чистить и в catch, а если нет Эксцепшина то просто в коде).

2.0K
15 января 2003 года
Skolotovich
39 / / 13.12.2002
Цитата:
Originally posted by gray_k
Такой вопрос.
если я напишу такой код
code:
[COLOR=blue]
code:
try
{
//somecode
if(MyIf)
return;
}
__finally
{
//finallycode
}
return;
[/COLOR]
то при выполнении условия MyIf будет ли исполнен код finallycode



приветствую

код не выполнится, return все таки
просто выйдешь из функции и все на этом

362
15 января 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by moonmike

Насколько я С++ помню код заключенный в __finally исполняется в любом случае.А добавлен данный спецификатор для того чтобы не очишать память в нескольких местах.(То есть если у тя вылет по Эксцепшину то надо память чистить и в catch, а если нет Эксцепшина то просто в коде).



try
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}


а что если проверить, господа хацкеры, или у вас интернет работает быстрее чем компиллятор.
Код выполнятется, и выводится оба сообщения

------
с уважением

2.0K
15 января 2003 года
Skolotovich
39 / / 13.12.2002
Цитата:
Originally posted by _kolyan


try
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}


а что если проверить, господа хацкеры, или у вас интернет работает быстрее чем компиллятор.
Код выполнятется, и выводится оба сообщения

------
с уважением



тогда это нарушает основные принципы С
return -- выход из функции в любом случае
как по мне это некоректно

1.7K
15 января 2003 года
Mark
114 / / 21.11.2002
Цитата:
Originally posted by Skolotovich


тогда это нарушает основные принципы С
return -- выход из функции в любом случае
как по мне это некоректно


Если о принципах С, то
if(MyIf);
return;
-это выход в любом случае, а
if(MyIf)
return;
- это выход не в любом случае.
А "корректность" в данном случае я бы назвал "читабельностью", которая здесь, на мой взгляд, ни чуть не хуже, чем при использовании break.

362
15 января 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by Skolotovich


тогда это нарушает основные принципы С
return -- выход из функции в любом случае
как по мне это некоректно



в принципе return это и есть выход в любом случае, а __finally можно рассматривать как ту самую точку выхода из функции, просто раньше мы ее не видели. Если рассмаривать ассемблерный код то на месте выхода из функции стоят разные инструкции по очистке памяти, и все такое, их вставляет туда компиллятор. А __finally просто даетя нам возможность добавить на это место свой код. Так что вряд ли это некорректоность, скорее риближение к истокам ;-)

2.0K
15 января 2003 года
Skolotovich
39 / / 13.12.2002
Цитата:
Originally posted by Mark

Если о принципах С, то
if(MyIf);
return;
-это выход в любом случае, а
if(MyIf)
return;
- это выход не в любом случае.
А "корректность" в данном случае я бы назвал "читабельностью", которая здесь, на мой взгляд, ни чуть не хуже, чем при использовании break.



я имел виду вообщем
к примеру такой случай:
я ставлю return если хочу выйти из функции, игнорируя весь код после нее.
я хочу чтоб __finally в одном случае выполнялся, а в другом нет.
а здесь получается, что старый привычный способ выхода из функции фиг поможет
этот фича очень некоректна
здесь дядя Борланд очень не прав

358
15 января 2003 года
moonmike
423 / / 18.10.2002
Цитата:
Originally posted by Skolotovich


я имел виду вообщем
к примеру такой случай:
я ставлю return если хочу выйти из функции, игнорируя весь код после нее.
я хочу чтоб __finally в одном случае выполнялся, а в другом нет.
а здесь получается, что старый привычный способ выхода из функции фиг поможет
этот фича очень некоректна
здесь дядя Борланд очень не прав


Интересный ты какой.Я хочу чтоб __finally в одном случае выполнялся, а в другом нет.
Понимаешь в чем дело __finally В любом случае выполняется, для того и придуман был. Это никак не нарушает структуру языка. Вопросу и претензии к Ритчи, Страуструпу и ANSI.

1.8K
15 января 2003 года
ALI
129 / / 10.01.2003
читаем help:

Цитата:
The __finally keyword specifies actions that should be taken regardless of how the flow within the preceding __try exits .



далее пробуем такой код:

 
Код:
try
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}
MessageBox(NULL, "after __finally", "", 0);

кто нить третий MessageBox видел?
Я НЕТ
362
17 января 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by ALI
пробуем такой код:
 
Код:
try
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}
MessageBox(NULL, "after __finally", "", 0);

кто нить третий MessageBox видел?
Я НЕТ



интересно, а вот если return убрать, то третье сообщение видно!
все-таки __finally это не совсем точка выхода из функции, раз он используется только с try, то может это что-то вроде catch, который отлавливает return из try, выполянет код и выбрасывается из функции, а если return не было, просто выполняется как обычный код и не выбрасывается
...замудренная штука

1.8K
17 января 2003 года
ALI
129 / / 10.01.2003
Цитата:
Originally posted by _kolyan

...замудренная штука



Я ничего замудренного не вижу
просто нужно внимательно читать

 
Код:
The __finally keyword specifies actions that should be taken regardless of how the flow within the preceding __try exits .


Перевожу на русский

 
Код:
Ключевое слово __finally  указывает на действия
кототорые должны быть призведены вне зависимости
от того как произошел выход из предшевствующего  блока __try.


я думаю что если дизассемблировать то такой блок то мы скорее всего увидим что он выделен в качестве функции и то что находится в точке
выхода это и есть __finally
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог