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

А как обходиться в C++ без finally в try блоке? Т.е. что делать вместо

try
{
DoSomething();
}
finally
{
Cleanup();
}
...
Рейтинг: 0 / 0
Exception handling
    #34083719
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
try
{
;
}
catch(...)
{
}
...
Рейтинг: 0 / 0
Exception handling
    #34083812
не, не так, здесь catch(...) не поможет
у finally в c# (о нем речь?) совсем другая семантика

можно добится сходного поведения двумя путями

(1) после блока catch(...) поставить код освобождения ресурсов, но при условиях:

- в блоках try и обработчиков нет return
- в блоках обработчиков не возбуждаются неперехватываемые исключения
- освобождаемые ресурсы не локальны внутри блока try

(2) использовать локальные для try-блока врапперы ресурсов с освобождением их в деструкторах
...
Рейтинг: 0 / 0
Exception handling
    #34083864
egorovshura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Голенков Владимирне, не так, здесь catch(...) не поможет
у finally в c# (о нем речь?) совсем другая семантика

Да finally как C# или в Delphi.


(1) после блока catch(...) поставить код освобождения ресурсов, но при условиях:

- в блоках try и обработчиков нет return
- в блоках обработчиков не возбуждаются неперехватываемые исключения
- освобождаемые ресурсы не локальны внутри блока try


это не подходит

(2) использовать локальные для try-блока врапперы ресурсов с освобождением их в деструкторах

А вот это можно попробовать. Если я правильно понял речь идет о след.:

try
{
MyResourceType mr();

}
catch()
{
}

А в деструкторе MyResourceType код освобождения. Хотя нафига тогда try вообще? при выходе из скопа функции у меня деструктор все равно вызовется, хоть по исключению хоть по простому return.

Я заметил, что VC подсвечивает слова finally и __finally как ключевые, но ругается, когда я их в коде использую. Почему?
...
Рейтинг: 0 / 0
Exception handling
    #34083886
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorovshuraА в деструкторе MyResourceType код освобождения. Хотя нафига тогда try вообще?

Как область отлова инсключений
...
Рейтинг: 0 / 0
Exception handling
    #34083931
Я заметил, что VC подсвечивает слова finally и __finally как ключевые, но ругается, когда я их в коде использую. Почему?

это расширения от MS:

In addition to try and catch clauses, CLR exception handling supports a finally clause. The semantics are identical to the __finally block in structured exception handling (SEH). A __finally block can follow a try or catch block.
...
Рейтинг: 0 / 0
Exception handling
    #34083966
egorovshura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Голенков Владимир Я заметил, что VC подсвечивает слова finally и __finally как ключевые, но ругается, когда я их в коде использую. Почему?

это расширения от MS:

In addition to try and catch clauses, CLR exception handling supports a finally clause. The semantics are identical to the __finally block in structured exception handling (SEH). A __finally block can follow a try or catch block.

Блин. А в unmanaged C++ можно его как-нить использовать?
...
Рейтинг: 0 / 0
Exception handling
    #34083994
egorovshura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кажется нашел. Нужно использовать ключевые слова с префиксом из двух подчеркиваний:

__try
{
}
__finally
{
}
...
Рейтинг: 0 / 0
Exception handling
    #34084012
Блин. А в unmanaged C++ можно его как-нить использовать?

вероятно можно, ведь structured exception handling (SEH) появилось задолго до CLR

да вот только непереносимо

лично я не пользовался
...
Рейтинг: 0 / 0
Exception handling
    #34084113
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorovshuraА как обходиться в C++ без finally в try блоке?
Мы в свое время просто написать макрос. Не помню его реализацию, суть в том, что код

Код: plaintext
1.
2.
try {
  ...
finally (X)

преобразовывался в

Код: plaintext
1.
2.
3.
4.
5.
6.
try {
  ...
  X; }
catch (...) {
  X;
  throw;
}
...
Рейтинг: 0 / 0
Exception handling
    #34084412
egorovshura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer egorovshuraА как обходиться в C++ без finally в try блоке?
Мы в свое время просто написать макрос. Не помню его реализацию, суть в том, что код

Код: plaintext
1.
2.
try {
  ...
finally (X)

преобразовывался в

Код: plaintext
1.
2.
3.
4.
5.
6.
try {
  ...
  X; }
catch (...) {
  X;
  throw;
}


Это не то же самое. Если эксепшен произойдет в клинапе (X). Думаю после этого приложение не выживет. Вообще странно, что в стандарте языка нет такой конструкции. По-моему она слишком полезная чтобы ее стороной обходить
...
Рейтинг: 0 / 0
Exception handling
    #34084432
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorovshuraА как обходиться в C++ без finally в try блоке? Т.е. что делать вместо

try
{
DoSomething();
}
finally
{
Cleanup();
}

Использовать RAII, RAII и еще раз RAII ...
...
Рейтинг: 0 / 0
Exception handling
    #34084763
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorovshuraЭто не то же самое.
Не то же. Но для практических целей достаточно хорошо.

egorovshuraЕсли эксепшен произойдет в клинапе (X). Думаю после этого приложение не выживет.
Я не помню, защищались ли мы от этого (сейчас я все-таки привел суть, а не тонкости), но не считаю это принципиальным. Помнить, конечно, нужно.

egorovshuraВообще странно, что в стандарте языка нет такой конструкции. По-моему она слишком полезная чтобы ее стороной обходить
Скажем так, для меня вообще странно отсутствие многих конструкций в некоторых языках. Сходу, это finally, properties, изменение области видимости члена класса, публикация, полная или выборочная, членов объектного члена класса.
...
Рейтинг: 0 / 0
Exception handling
    #34086373
egorovshura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZrenBy egorovshuraА как обходиться в C++ без finally в try блоке? Т.е. что делать вместо

try
{
DoSomething();
}
finally
{
Cleanup();
}

Использовать RAII, RAII и еще раз RAII ...


А что это такое?
...
Рейтинг: 0 / 0
Exception handling
    #34086431
"Использовать RAII, RAII и еще раз RAII ..."
А что это такое?


а в Гугле набрать?!
...
Рейтинг: 0 / 0
Exception handling
    #34086440
egorovshura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прочитал в википедии про RAII. Очень конечно хороший подход, но что делать с классами, которые я не могу изменить? Сторонняя библиотека к которой у меня нет исходников. Не оборачивать же все классы в свои соответствующие философии RAII.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Exception handling
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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