powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ exceptions. Best practices.
25 сообщений из 82, страница 3 из 4
C++ exceptions. Best practices.
    #38867123
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ тут переживал за идентификацию "места" исключения.Исключения полезны тогда, когда мы можем разделить "нормальный" и "ошибочный" потоки исполнения.
Если нам требуется знать место исключения, то или мы не правы в своих желаниях или нам требуется протоколирование.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867131
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели я покину этот топик неудовлетворённым.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867136
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мы написали try/catch, то во всём охраняемом блоке однотипные исключения обрабатываются идентичным образом.
Если это не так, то или требуется более одного охраняемого блока или нам нужны не исключения.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867139
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlАнатолий, прочитайте мой пост еще раз. И на этот раз не по диагонали, и не ограничиваясь примерами.
Ну вот читаю еще раз.
White OwlНо ему надо понять какая конкретно операция упала, а он не может этого сделать.
Это нужно программисту расследующему баги. И это решается логированием, как я выше привел.Угу, логирование это хорошо.
Но логирование это ручная операция. А исключения полу-автоматическая с поддержкой на уровне языка. Исключения могут служить для целей логирования, но...
Anatoly MoskovskyА вот зачем самой функции в процессе выполнения это знать?Затем, что некоторые ошибки времени выполнения не являются смертельными и могут быть обработаны автоматически.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867147
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivWhite OwlПадение произошло внутри одной из функций. Мало знать какая функция упала, надо еще знать почему она упала.
Кто мешает тебе во время выбрасывания исключения сохранить эту важную информацию (где и почему) внутри самого исключения?Если проблему отловил мой код - то ничто не мешает. А если проблема случилась внутри библиотечной функции, то я уже никак не могу повлиять на созданное исключение. Я могу только перехватить его послать вместо него свое собственное, которое локализует проблему до уровня "какая функция упала", но не более того.

MasterZivWhite OwlЭто более-менее хорошо сделано в java, где исключение автоматоматически собирает полный стек вызовов при передаче на верхние уровни. Кто мешает тебе в С++ сделать то же самое ?Ничто не мешает. И если я работаю в проекте с исключениями - всегда веду полный трейс.
Правда я редко с такими проектами работаю :)
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867151
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlAnatoly MoskovskyА вот зачем самой функции в процессе выполнения это знать?Затем, что некоторые ошибки времени выполнения не являются смертельными и могут быть обработаны автоматически.
Ну так обрабатывайте, зачем знать откуда брошено исключение?
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867319
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite Owlпропущено...
Затем, что некоторые ошибки времени выполнения не являются смертельными и могут быть обработаны автоматически.
Ну так обрабатывайте, зачем знать откуда брошено исключение?Чтобы знать как его обрабатывать. Одинаковые ошибки произошедшие в разных местах могут потребовать разной обработки.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867375
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЧтобы знать как его обрабатывать. Одинаковые ошибки произошедшие в разных местах могут потребовать разной обработки.
Еще раз. Зачем верхнему уровню абстракции знать где именно на нижнем уровне брошено исключение, если верхний уровень вообще не должен знать устройство нижнего?
Сделайте нормальную декомпозицию и эта нужда отпадет.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867383
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще конечно смешно наблюдать, как человек, который ненавидит и С++ и концепцию исключений, рассказывает как должны быть устроены исключения и как их правильно применять в С++
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867781
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толик я вообще не понял к чему этот пост? Или к кому?
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867818
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТолик я вообще не понял к чему этот пост? Или к кому?
А просто так.
У нас же здесь все просто так.
Кто-то в форуме по С++ рассуждает про то как оптимизаторы СУБД используют индексы.
А я вот про это. И самое главное что все в рамках топика - про С++ и исключения
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867850
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно тебя попросить не писать просто так вещи которые
могут задеть или обидеть меня или мемберов?

Модератор: Break. Ничего обидного не было и, надеюсь, не будет. Так что поссориться нам не удастся.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867871
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlAnatoly Moskovskyпропущено...

Ну так обрабатывайте, зачем знать откуда брошено исключение?Чтобы знать как его обрабатывать. Одинаковые ошибки произошедшие в разных местах могут потребовать разной обработки.

Ну ты вот всё время приводишь проблемы, которые одинаково возникают и при использовании исключений, и при использований
кодов возврата. Так что исключения там или нет -- по барабану.

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

после вызова каждой функции надо проверять код возврата. При каскадном вызове функций -- при каждом вложенном вызове.

Исключения же накладывают только одно дополнительное ограничение -- ими нужно уметь пользоваться:

исключения должны генерироватья только в случае, если нормальное течение потока управления не может продолжаться.

Ну очевидно же, что исключения более гибкие.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867872
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТолик я вообще не понял к чему этот пост? Или к кому?

К нашему Мудрому Сову, естественно.
Ну не любит человек исключения. Не любит, не понимает, и не хочет понимать. Или уже понял, но нелюбовь осталась.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867878
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что-ж продолжим обсуждать исключения.

Давайте коснёмся перформанса. Исключения в цикле e.t.c.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867882
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИсключения в цикле e.t.c.
В рекурсии интереснее :)
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867903
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ рекурсии интереснее :)
Неа, интереснее форвардинг исключений из сопрограмм (coroutine).
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38867909
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавайте коснёмся перформанса.
Ну, я думаю что на данном этапе развития компиляторов, никакого существенного оверхеда исключения не вносят.
Ведь это нечастое событие - вызов исключения, поэтому сколько там микросекунд оно занимает не сильно важно.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38868089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если исключение - это объект который нужно аллоцировать. Напихать в него свойств....
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38868159
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу ты вот всё время приводишь проблемы, которые одинаково возникают и при использовании исключений, и при использований кодов возврата. Так что исключения там или нет -- по барабану.Да. Любую задачу можно решить как с исключениями, так и с кодами возврата.

MasterZivКоды возврата же накладывают два дополнительных ограничения:
каждая функция должна принимать дополнительный параметр для возврата кода ошибки или должна не быть функцией (возвращаемое значение будет кодом возврата).
Это не обязательно. Вспомни хоть о libc с его errno и WinAPI с GetLastError().

MasterZiv после вызова каждой функции надо проверять код возврата. При каскадном вызове функций -- при каждом вложенном вызове.
Это тоже не обязательно. Очень часто функция может возвращать много информационных кодов которые можно игнорировать. Да и часто бывает что несколько родственных функций запускается подряд и падение второй функции в цепочке невозможно если отработала первая. Как пример fopen()-fread(), если мы файл сумели открыть, мы всегда сумеем его прочитать (уже другое дело сколько именно байт мы прочитаем), но fread() упасть просто не сможет.
Во всех этих случаях, коды возврата можно запросто игнорировать. А при работе с исключениями эта проверка будет всегда, ее компилятор насильно в твой код впихнет.

MasterZivИсключения же накладывают только одно дополнительное ограничение -- ими нужно уметь пользоваться:
исключения должны генерироватья только в случае, если нормальное течение потока управления не может продолжаться.
Угу. А как быть с информационными сообщениями? Тот же SQL_SUCCESS_WITH_INFO если ты делаешь враппер для ODBC? Делать такие возвраты как исключения или как коды возврата в дополнение к исключениям которые будут перекрывать SQL_ERROR?

И перевирая твои слова: Ну очевидно же, что кода возврата более гибкие.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38868164
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskymaytonДавайте коснёмся перформанса.
Ну, я думаю что на данном этапе развития компиляторов, никакого существенного оверхеда исключения не вносят.
Ведь это нечастое событие - вызов исключения, поэтому сколько там микросекунд оно занимает не сильно важно.Да при чем здесь вызов исключения то? Как по твоему организован try{}catch блок?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
try {
   call1();
      if (exception_happened) jump local_catch_block; // added by compiler
   call2();
      if (exception_happened) jump local_catch_block; // added by compiler
   call3();
      if (exception_happened) jump local_catch_block; // added by compiler
} catch(...) {}


Чтобы исключение поймать, надо сначала узнать что оно есть. И наличие проверки на появилось ли исключение или нет, никак не зависит от практического создания исключения.

И кстати, для полноты картины:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
bool exception_happened = false; // global variable

   call1();
   if (exception_happened) jump local_catch_block;
   call2();
   if (exception_happened) jump local_catch_block;
   call3();
   if (exception_happened) jump local_catch_block;
   jump after_local_catch_block;
local_catch_block:
   // some error handling
after_local_catch_block:


Функционально тоже самое что и языко-поддерживаемые исключения, но в "ручном" режиме.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38868168
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА как быть с информационными сообщениями? Тот же SQL_SUCCESS_WITH_INFO если ты делаешь враппер для ODBC? Делать такие возвраты как исключения или как коды возврата в дополнение к исключениям которые будут перекрывать SQL_ERROR?
Ни то ни другое.
Вот эти инфо - это данные, один из результатов работы функции, а не код ошибки.
Поэтому должен быть предусмотрен АПИ для доступа к этому результату, специально разработанный для удобства пользования им, т.е. ответ зависит от того для чего нужно получать эту инфу и можно ли ее игнорировать вообще.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38868172
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Немного отвлеку вас.

По смыслам.

Наш аналитик часто толкает в ТЗ такие сущности.

1). Основной поток. Здесь описывается кейс приложения в случае если юзер сделал ряд кликов предусмотренных ТЗ. И получил данные.

2). Альтернативный поток . Здесь описывается кейс когда данные не найдены. Альтернатив может быть много.

3) Исключающий поток . Здесь описывается блок т.н. непредвиденной ситуации. Когда ТЗ просто не в состоянии
охватить всё разнообразие ошибок workflow. Отвалился сокет. БД выкинула ORA-1555. Restful внезапно вернул
общий код падения экземпляра сервера. Тут вообще может быть что угодно. Исключающий поток обладает
свойством вклиниваться в любой из шагов основного или альтернативного потоков. Если-бы заказчик
описывал эти кейсы на каждом шаге то ТЗ можно сделать Талмудом или Энциклопедией. И сроки вычитки
и анализа отодвинуть в бесконечность.

По уровням технологий.

Ассемблер. Все кто кодили помнят флаговый регистр. Что-бы ты не делал - эффект каждого опкода
оказывает на флажки влияние. Хочешь - обработай. Хочешь - нет. Вобщем полнейший либерализм.
Цена решения - копеешная. Скорость - перфектная.

Bash-скриптинг . Формально любой процесс ОС возвращает коды возврата. При неком удачном кодинге

Код: python
1.
$ ./process1 && ./process2 && ./process3 



будет блоком try. Если конешно кодер использовал осмысленный return из функции main(..).
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38868179
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКак по твоему организован try{}catch блок?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
try {
   call1();
      if (exception_happened) jump local_catch_block; // added by compiler
   call2();
      if (exception_happened) jump local_catch_block; // added by compiler
   call3();
      if (exception_happened) jump local_catch_block; // added by compiler
} catch(...) {}


Ну, наверно есть компиляторы которые так реализуют. Но мне они неизвестны.
Обычно реализуется по другому.
В частности, нет никаких проверок после каждого вызова.
Вместо этого есть глобальный стек текущего потока в котором хранятся вызовы деструкторов в том порядке в каком их надо вызвать при развороте стека в момент бросания исключения. Этот стек обновляется при инициализации переменных блока и при выходе из блока. Там же хранятся указания какие и где ловятся исключения.
Практически вся эта инфа формируется при компиляции и в рантайме просто двигается указатель.

Что это значит с практической точки зрения.
Например то, что если у вас есть модуль в котором все функции написаны в стиле С (более того, даже откомпилированы как С) (т.е. без объектов с деструкторами), то в этом модуле кода обвязки исключений не будет никакого вообще (а также связанного с ним хоть мизерного, но оверхеда), но при этом исключения из вызываемых им функций будут наверх передаваться.
...
Рейтинг: 0 / 0
C++ exceptions. Best practices.
    #38868200
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2787Хотел бы поделиться своим подходом ...
Конечно он не идеален, но много упрощает анализ результата выполнения функции.

Над всеми libraries, которые использую создаю wrapper classes.
Зачем?
Их назначение одно - они инкапсулируют обработку результата выполнения функции.
В результате анализ результата выполнения функции сводится к анализу member m_Ok.
Если он не имеет значения TRUE, то анализируем значение m_LastErrorCode
/в этом случае m_pMessageError содержит message .../
Т.е. мне не нужно думать о том, что в случае ошибки нужно вызывать GetLastError() ... ...
Кстати в wrapper class состав members зависит от того в каком режиме собран exe, dll, ... /release или debug/.

PS: Конечно это не панацея, но чисто субъективно /а может быть от привычки/, использую такой подход всегда.
Кстати такой подход позволяет получить на выходе не просто возвращаемое значение, а в случае
необходимости и несколько возвращаемых значений /правда необходимость в этом возникает редко/.
Кроме того, так как мы не напрямую вызываем функции, то можно сказать мы создаем некий интерфейс над
library /со всеми вытекающими из этого + и -/.
...
Рейтинг: 0 / 0
25 сообщений из 82, страница 3 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ exceptions. Best practices.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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