powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / __try __finally и C++
15 сообщений из 15, страница 1 из 1
__try __finally и C++
    #34108462
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня!

Скажите, а какие альтернативы "__try __finally" есть в C++??

try cath except подойдет?
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108484
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел. СВсем доброго дня!

Скажите, а какие альтернативы "__try __finally" есть в C++??

try cath except подойдет?

в принципе, да
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108500
AsPiro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А среда разработки у Вас какая?
По стандарту должны быть:
Код: plaintext
1.
2.
try
catсh(Exception &E)
Но например, в CBuilder дополнительно есть:
Код: plaintext
1.
2.
__except
__finally 
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108505
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но как мне выйти из блока try{} принудительно???

Например, при работе программы обнаружилась ошибка, но никаких исключительных ситуаций не возникает, а мне нужно пропустить то, что осталось в блоке try{} и перейти на завершающий код (чистит память, хендлцы и.т.д.)
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108510
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Среда разработки - M$ VC
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108540
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь сам сгененерить исключение. Можешь, выйти ретурном.

На счет чистки памяти. В С++ нет finaly. Наиболее простой способ управления памяти - создание статических объектов в блоке try. Тогда память автоматически очистится.
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108550
AsPiro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел. СНо как мне выйти из блока try{} принудительно???
Ни понил! Зачем это???

Павел. СНапример, при работе программы обнаружилась ошибка, но никаких исключительных ситуаций не возникает, а мне нужно пропустить то, что осталось в блоке try{} и перейти на завершающий код (чистит память, хендлцы и.т.д.)
Во-первых: нужно помнить важное правило - использовать try{} для обнаружения действительно исключительных ситуаций!
Во-вторых: такую ошибку обрабатывать с помощью:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
if(условие ошибки)
    {
    ;//Если ошибка возникла
    }
else
    {
    //Если ошибки нет 
    }
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108557
AsPiro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел. СЧтобы было понятнее, поясните задачу - какие ошибки собираетесь отлавливать?
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108692
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
char * Str = (char *)malloc( 12345 );

int result=SomeFunctionCall_1();
if ( (result!= 0 ) && (result!= 1 ))
{
//Все плохо, нас не устраивает результат

//GOTO exit;
}

result=SomeFunctionCall_2();
if ( (result!= 2 ) && (result!= 3 ))
{
//Все плохо, нас не устраивает результат

//GOTO exit;
}
// некий код

exit: 
if (Str)
  free(Str);
SetLastResult(result);
closeHandle(hHandle);


Вот, думаю понятно))

Смысл в чем... Если возникает какая-либо ошибка в программе (логическая, сама программа решает что это ошибка) мне нужно обязательно грамотно завершить выполнение. (в данном примере -перейти на метку exit)
Неужели нужно постоянно использовать if () else()??? А если код завершения имеет большой объем??

Вобщем в С есть для этого конструкция __try __leave __finally. Нужен аналог для CPP.

Всем спасибо за помощь!
...
Рейтинг: 0 / 0
__try __finally и C++
    #34108827
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать флаг успешности

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
int result= 0 ;

try{
ret=someFunc1();
if (ret!= 0  && ret!= 1  )
  ret= 1 ;

if (ret== 0 ) {
ret=someFunc2();
if (ret!= 2  && ret!= 3  )
  ret= 2 ;
}

if (ret== 0 ) {
ret=someFunc3();
if (ret!= 2  && ret!= 3  )
  ret= 3 ;
}

except tra_ly_ly;
} catch {
//Парсим код ошбки
}

или же не использовать except tra_ly_ly;
, часть обработки ошибки перенести после catch.

Еще вариант, делать для каждой someFuncX() отдельный try{}. И желательно все операции целостности инкапсулировать в каждом блоке.
...
Рейтинг: 0 / 0
__try __finally и C++
    #34110636
AsPiro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может проще код видоизменить так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
char * Str = (char *)malloc( 12345 );

int result=SomeFunctionCall_1();
if ( (result= 0 )||(result= 1 ))
  {//Все отлично, идём дальше:)
  result=SomeFunctionCall_2();
  if ( (result= 2 )||(result= 3 ))
    {//Все опять отлично, идём ещё дальше:)
     // некий код
    }
  }
else
  {//Все плохо, нас не устраивает результат
  if (Str)free(Str);
  SetLastResult(result);
  closeHandle(hHandle);  
  }


I Live Again!
...
Рейтинг: 0 / 0
__try __finally и C++
    #34110640
AsPiro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо если функций типа SomeFunctionCall_xx туева хуча, я бы разбил твой код на две функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
//------------------------------------------------------
void F1()
{
char * Str = (char *)malloc( 12345 );

int Result=F2();

if(Result=- 1 )
  {//Все плохо, зачищаемся!
  if (Str)free(Str);
  SetLastResult(result);
  closeHandle(hHandle);    
  }
}
//------------------------------------------------------
int F2()
{
int result=SomeFunctionCall_1();
if ( (result!= 0 ) && (result!= 1 ))
  {//Все плохо, нас не устраивает результат
  return - 1 ;
  }

result=SomeFunctionCall_2();
if ( (result!= 2 ) && (result!= 3 ))
  {//Все плохо, нас не устраивает результат
  return - 1 ;
  }

//Все отлично
return  1 ;
}

I Live Again!
...
Рейтинг: 0 / 0
__try __finally и C++
    #34110870
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запихать все хендлы и поинтеры внутрь класса, экземпляр которого (не указатель!) создается как локальная переменная в функции. В деструкторе этого класса всё закрывать/освобождать. Вместо goto - просто return.
...
Рейтинг: 0 / 0
__try __finally и C++
    #34111168
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошая идея!

Всем спасибо за советы.
...
Рейтинг: 0 / 0
__try __finally и C++
    #34111197
AsPiro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел. СХорошая идея!Которая?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / __try __finally и C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]