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

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

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

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

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

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

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

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

Павел. СНапример, при работе программы обнаружилась ошибка, но никаких исключительных ситуаций не возникает, а мне нужно пропустить то, что осталось в блоке try{} и перейти на завершающий код (чистит память, хендлцы и.т.д.)
Во-первых: нужно помнить важное правило - использовать try{} для обнаружения действительно исключительных ситуаций!
Во-вторых: такую ошибку обрабатывать с помощью:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
if(условие ошибки)
    {
    ;//Если ошибка возникла
    }
else
    {
    //Если ошибки нет 
    }
...
Рейтинг: 0 / 0
07.11.2006, 11:41
    #34108557
AsPiro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
__try __finally и C++
Павел. СЧтобы было понятнее, поясните задачу - какие ошибки собираетесь отлавливать?
...
Рейтинг: 0 / 0
07.11.2006, 12:16
    #34108692
Павел. С
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
__try __finally и C++
Вот пример:
Код: 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
07.11.2006, 12:47
    #34108827
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
__try __finally и C++
Можно использовать флаг успешности

Код: 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
08.11.2006, 03:46
    #34110636
AsPiro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
__try __finally и C++
А может проще код видоизменить так:
Код: 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
08.11.2006, 03:59
    #34110640
AsPiro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
__try __finally и C++
Либо если функций типа 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
08.11.2006, 09:04
    #34110870
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
__try __finally и C++
Запихать все хендлы и поинтеры внутрь класса, экземпляр которого (не указатель!) создается как локальная переменная в функции. В деструкторе этого класса всё закрывать/освобождать. Вместо goto - просто return.
...
Рейтинг: 0 / 0
08.11.2006, 10:37
    #34111168
Павел. С
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
__try __finally и C++
Хорошая идея!

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


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