Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonЯ тут переживал за идентификацию "места" исключения.Исключения полезны тогда, когда мы можем разделить "нормальный" и "ошибочный" потоки исполнения. Если нам требуется знать место исключения, то или мы не правы в своих желаниях или нам требуется протоколирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 18:48 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Неужели я покину этот топик неудовлетворённым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 18:54 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Если мы написали try/catch, то во всём охраняемом блоке однотипные исключения обрабатываются идентичным образом. Если это не так, то или требуется более одного охраняемого блока или нам нужны не исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 18:57 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite OwlАнатолий, прочитайте мой пост еще раз. И на этот раз не по диагонали, и не ограничиваясь примерами. Ну вот читаю еще раз. White OwlНо ему надо понять какая конкретно операция упала, а он не может этого сделать. Это нужно программисту расследующему баги. И это решается логированием, как я выше привел.Угу, логирование это хорошо. Но логирование это ручная операция. А исключения полу-автоматическая с поддержкой на уровне языка. Исключения могут служить для целей логирования, но... Anatoly MoskovskyА вот зачем самой функции в процессе выполнения это знать?Затем, что некоторые ошибки времени выполнения не являются смертельными и могут быть обработаны автоматически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 19:00 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
MasterZivWhite OwlПадение произошло внутри одной из функций. Мало знать какая функция упала, надо еще знать почему она упала. Кто мешает тебе во время выбрасывания исключения сохранить эту важную информацию (где и почему) внутри самого исключения?Если проблему отловил мой код - то ничто не мешает. А если проблема случилась внутри библиотечной функции, то я уже никак не могу повлиять на созданное исключение. Я могу только перехватить его послать вместо него свое собственное, которое локализует проблему до уровня "какая функция упала", но не более того. MasterZivWhite OwlЭто более-менее хорошо сделано в java, где исключение автоматоматически собирает полный стек вызовов при передаче на верхние уровни. Кто мешает тебе в С++ сделать то же самое ?Ничто не мешает. И если я работаю в проекте с исключениями - всегда веду полный трейс. Правда я редко с такими проектами работаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 19:09 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
White OwlAnatoly MoskovskyА вот зачем самой функции в процессе выполнения это знать?Затем, что некоторые ошибки времени выполнения не являются смертельными и могут быть обработаны автоматически. Ну так обрабатывайте, зачем знать откуда брошено исключение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 19:11 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite Owlпропущено... Затем, что некоторые ошибки времени выполнения не являются смертельными и могут быть обработаны автоматически. Ну так обрабатывайте, зачем знать откуда брошено исключение?Чтобы знать как его обрабатывать. Одинаковые ошибки произошедшие в разных местах могут потребовать разной обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 00:16 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
White OwlЧтобы знать как его обрабатывать. Одинаковые ошибки произошедшие в разных местах могут потребовать разной обработки. Еще раз. Зачем верхнему уровню абстракции знать где именно на нижнем уровне брошено исключение, если верхний уровень вообще не должен знать устройство нижнего? Сделайте нормальную декомпозицию и эта нужда отпадет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 07:58 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Вообще конечно смешно наблюдать, как человек, который ненавидит и С++ и концепцию исключений, рассказывает как должны быть устроены исключения и как их правильно применять в С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 08:14 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Толик я вообще не понял к чему этот пост? Или к кому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 14:14 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonТолик я вообще не понял к чему этот пост? Или к кому? А просто так. У нас же здесь все просто так. Кто-то в форуме по С++ рассуждает про то как оптимизаторы СУБД используют индексы. А я вот про это. И самое главное что все в рамках топика - про С++ и исключения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 14:42 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Можно тебя попросить не писать просто так вещи которые могут задеть или обидеть меня или мемберов? Модератор: Break. Ничего обидного не было и, надеюсь, не будет. Так что поссориться нам не удастся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:02 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
White OwlAnatoly Moskovskyпропущено... Ну так обрабатывайте, зачем знать откуда брошено исключение?Чтобы знать как его обрабатывать. Одинаковые ошибки произошедшие в разных местах могут потребовать разной обработки. Ну ты вот всё время приводишь проблемы, которые одинаково возникают и при использовании исключений, и при использований кодов возврата. Так что исключения там или нет -- по барабану. Коды возврата же накладывают два дополнительных ограничения: каждая функция должна принимать дополнительный параметр для возврата кода ошибки или должна не быть функцией (возвращаемое значение будет кодом возврата). после вызова каждой функции надо проверять код возврата. При каскадном вызове функций -- при каждом вложенном вызове. Исключения же накладывают только одно дополнительное ограничение -- ими нужно уметь пользоваться: исключения должны генерироватья только в случае, если нормальное течение потока управления не может продолжаться. Ну очевидно же, что исключения более гибкие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:19 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonТолик я вообще не понял к чему этот пост? Или к кому? К нашему Мудрому Сову, естественно. Ну не любит человек исключения. Не любит, не понимает, и не хочет понимать. Или уже понял, но нелюбовь осталась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:21 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Ну что-ж продолжим обсуждать исключения. Давайте коснёмся перформанса. Исключения в цикле e.t.c. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:27 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonИсключения в цикле e.t.c. В рекурсии интереснее :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:31 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Dima TВ рекурсии интереснее :) Неа, интереснее форвардинг исключений из сопрограмм (coroutine). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:44 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonДавайте коснёмся перформанса. Ну, я думаю что на данном этапе развития компиляторов, никакого существенного оверхеда исключения не вносят. Ведь это нечастое событие - вызов исключения, поэтому сколько там микросекунд оно занимает не сильно важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:50 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Если исключение - это объект который нужно аллоцировать. Напихать в него свойств.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 17:43 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
MasterZivНу ты вот всё время приводишь проблемы, которые одинаково возникают и при использовании исключений, и при использований кодов возврата. Так что исключения там или нет -- по барабану.Да. Любую задачу можно решить как с исключениями, так и с кодами возврата. MasterZivКоды возврата же накладывают два дополнительных ограничения: каждая функция должна принимать дополнительный параметр для возврата кода ошибки или должна не быть функцией (возвращаемое значение будет кодом возврата). Это не обязательно. Вспомни хоть о libc с его errno и WinAPI с GetLastError(). MasterZiv после вызова каждой функции надо проверять код возврата. При каскадном вызове функций -- при каждом вложенном вызове. Это тоже не обязательно. Очень часто функция может возвращать много информационных кодов которые можно игнорировать. Да и часто бывает что несколько родственных функций запускается подряд и падение второй функции в цепочке невозможно если отработала первая. Как пример fopen()-fread(), если мы файл сумели открыть, мы всегда сумеем его прочитать (уже другое дело сколько именно байт мы прочитаем), но fread() упасть просто не сможет. Во всех этих случаях, коды возврата можно запросто игнорировать. А при работе с исключениями эта проверка будет всегда, ее компилятор насильно в твой код впихнет. MasterZivИсключения же накладывают только одно дополнительное ограничение -- ими нужно уметь пользоваться: исключения должны генерироватья только в случае, если нормальное течение потока управления не может продолжаться. Угу. А как быть с информационными сообщениями? Тот же SQL_SUCCESS_WITH_INFO если ты делаешь враппер для ODBC? Делать такие возвраты как исключения или как коды возврата в дополнение к исключениям которые будут перекрывать SQL_ERROR? И перевирая твои слова: Ну очевидно же, что кода возврата более гибкие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 19:30 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskymaytonДавайте коснёмся перформанса. Ну, я думаю что на данном этапе развития компиляторов, никакого существенного оверхеда исключения не вносят. Ведь это нечастое событие - вызов исключения, поэтому сколько там микросекунд оно занимает не сильно важно.Да при чем здесь вызов исключения то? Как по твоему организован try{}catch блок? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Чтобы исключение поймать, надо сначала узнать что оно есть. И наличие проверки на появилось ли исключение или нет, никак не зависит от практического создания исключения. И кстати, для полноты картины: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Функционально тоже самое что и языко-поддерживаемые исключения, но в "ручном" режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 19:40 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
White OwlА как быть с информационными сообщениями? Тот же SQL_SUCCESS_WITH_INFO если ты делаешь враппер для ODBC? Делать такие возвраты как исключения или как коды возврата в дополнение к исключениям которые будут перекрывать SQL_ERROR? Ни то ни другое. Вот эти инфо - это данные, один из результатов работы функции, а не код ошибки. Поэтому должен быть предусмотрен АПИ для доступа к этому результату, специально разработанный для удобства пользования им, т.е. ответ зависит от того для чего нужно получать эту инфу и можно ли ее игнорировать вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 19:45 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
Коллеги. Немного отвлеку вас. По смыслам. Наш аналитик часто толкает в ТЗ такие сущности. 1). Основной поток. Здесь описывается кейс приложения в случае если юзер сделал ряд кликов предусмотренных ТЗ. И получил данные. 2). Альтернативный поток . Здесь описывается кейс когда данные не найдены. Альтернатив может быть много. 3) Исключающий поток . Здесь описывается блок т.н. непредвиденной ситуации. Когда ТЗ просто не в состоянии охватить всё разнообразие ошибок workflow. Отвалился сокет. БД выкинула ORA-1555. Restful внезапно вернул общий код падения экземпляра сервера. Тут вообще может быть что угодно. Исключающий поток обладает свойством вклиниваться в любой из шагов основного или альтернативного потоков. Если-бы заказчик описывал эти кейсы на каждом шаге то ТЗ можно сделать Талмудом или Энциклопедией. И сроки вычитки и анализа отодвинуть в бесконечность. По уровням технологий. Ассемблер. Все кто кодили помнят флаговый регистр. Что-бы ты не делал - эффект каждого опкода оказывает на флажки влияние. Хочешь - обработай. Хочешь - нет. Вобщем полнейший либерализм. Цена решения - копеешная. Скорость - перфектная. Bash-скриптинг . Формально любой процесс ОС возвращает коды возврата. При неком удачном кодинге Код: python 1. будет блоком try. Если конешно кодер использовал осмысленный return из функции main(..). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 19:49 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
White OwlКак по твоему организован try{}catch блок? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Ну, наверно есть компиляторы которые так реализуют. Но мне они неизвестны. Обычно реализуется по другому. В частности, нет никаких проверок после каждого вызова. Вместо этого есть глобальный стек текущего потока в котором хранятся вызовы деструкторов в том порядке в каком их надо вызвать при развороте стека в момент бросания исключения. Этот стек обновляется при инициализации переменных блока и при выходе из блока. Там же хранятся указания какие и где ловятся исключения. Практически вся эта инфа формируется при компиляции и в рантайме просто двигается указатель. Что это значит с практической точки зрения. Например то, что если у вас есть модуль в котором все функции написаны в стиле С (более того, даже откомпилированы как С) (т.е. без объектов с деструкторами), то в этом модуле кода обвязки исключений не будет никакого вообще (а также связанного с ним хоть мизерного, но оверхеда), но при этом исключения из вызываемых им функций будут наверх передаваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 20:03 |
|
||
|
C++ exceptions. Best practices.
|
|||
|---|---|---|---|
|
#18+
2787Хотел бы поделиться своим подходом ... Конечно он не идеален, но много упрощает анализ результата выполнения функции. Над всеми libraries, которые использую создаю wrapper classes. Зачем? Их назначение одно - они инкапсулируют обработку результата выполнения функции. В результате анализ результата выполнения функции сводится к анализу member m_Ok. Если он не имеет значения TRUE, то анализируем значение m_LastErrorCode /в этом случае m_pMessageError содержит message .../ Т.е. мне не нужно думать о том, что в случае ошибки нужно вызывать GetLastError() ... ... Кстати в wrapper class состав members зависит от того в каком режиме собран exe, dll, ... /release или debug/. PS: Конечно это не панацея, но чисто субъективно /а может быть от привычки/, использую такой подход всегда. Кстати такой подход позволяет получить на выходе не просто возвращаемое значение, а в случае необходимости и несколько возвращаемых значений /правда необходимость в этом возникает редко/. Кроме того, так как мы не напрямую вызываем функции, то можно сказать мы создаем некий интерфейс над library /со всеми вытекающими из этого + и -/. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 20:31 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38868168&tid=2019127]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 177ms |

| 0 / 0 |
