Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> KonstantinM
Принцип "Один вход, один выход" - для языков, не поддерживающих понятия деструктора, место его на свалке истории, это уже давно не актуально и просто не реально: даже если я не хочу использовать исключения (что глупо), я всё-таки широко использую сторонние бибилотеки, которые не собираються следовать рекомендациям двадцатилетней давности. Уже пятнадцать лет вместо этого используется идиома "Выделение ресурса есть инициализация", как вы могли этого не заметить?
P.S. я уже более полугода не видел сообщений, наподобие приведённого автором топика

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

И ещё, вот мнение двух людей, которые сейчас пожалуй пользуються наибольшим авторитетом в мире С++:
"Историччески некоторые стандарты кодирования требуют, чтобы каждая функция имела в точности один выход, что подразумевает одну инструкцию return. Такое требование является устаревшим в языках, поддерживающих исключения и деструкторы, так что функции обычно имеют несколько неявных выходов. Вместо этого стоит следовать странадрту наподобие рекомендации 5, которая требует от функций простоты и краткости, что делает их более простыми для понимания и более устойчивыми к ошибкам."
(Стандарты программирования на С++. Г.Саттер, А.Александреску. Правило №0, пример 4)

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

KonstantinM пишет:

надо гнобить на корню

Хотите гнобите сколько угодно.
Кто вам не запрещает?
Но если у меня есть возможность писать то что я хочу и реализовывать это наиболе очевидным образом - то я лично от этого отказываться не собираюсь.
А отлаживать ошибки вызванные отсутвием close (а еще если работают несколько человек) вместо того чтобы проверять работу задуманого алгоритма также не собираюсь.
Все остальное сказал archimag, большое спасибо ему за это smile

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

Александреску, конечно, авторитет. Но его фокусы в области обобщённого программирования больше подходят для фундаментальных разработок типа компилляторов. Его книгу " Особенности обобщённого программирования" я читал. А вот господам archimag'у и Roman'у настоятельно рекомендую обзавестись книгой Джона Роббинса "Отладка приложений под Windows и .NET". В ней достаточно прозрачно написано как программировать без использования catch и почему. На мой взгляд очень полезная книжка, особенно для успокоения излишних амбиций.
>KonstantinM
Сдаётся мне вы выражаете собственное мнение, пусть не всегда достаточно деликатно, а характер высказываний говорит о наличии достаточно большого количества набитых шишек. Достойно уважения.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> Сергей
Не могли ли Вы своими словами объяснить, как программировать без использования cath (особенно в .Net!!!) и почему так надо поступать?! А то, если в этой книжке действительно так написано, то мне совсем не хочется тратить на неё время smile
За четыре года, которые я занимаюсь программированием, благодаря рекомендациям, подчёрпнутым у таких авторов как Страуструп, Саттер, Александреску, Майерс и т.д, мне всего один раз пришлось заниматься действительно серьёзной отладкой - когда разрабатывал прогу, непосредственно управлявшую аппаратурой (классическое противостояние разработчика железа и программиста). Это может звучать как шутка, но я практически не умею пользоваться отладчиком - он мне никогда не был нужен.
А KonstantinM (при всём к нему уважению), похоже мешает его преподовательская практика. Действительно, основная масса современных студентов на удивление тупа (в чём мне пришлось недавно в очередной раз убедиться, когда мы искали ещё одного программиста). При общении с таким контингентом каких только предрасудков не наберёшься...
P.S. Книга Александреску называется не так и вряд ли вы смогли бы понять о чём она...

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> archimag
Давайте не будем пускаться в полемику что надо что фуфло.
try catch - нужны.
assert - нужны
иу - можно пользовать, особенно если умеешь, знаешь что это и как его едят.
STL - надо.
Щаблоны - надо.
Повторю свою мысль еще раз:
Есть грязными руками опасно, и раьше рекомендовали их мыть. Потом появилась вилка, мол теперь Вы к еде руками не прикасаетесь и можно забыть о том что надо париться и их мыть, но во первых - вилкой надо уметь пользоваться, а то можно "уколоться", а во-вторых руки все равно лучше помыть - просто цепочка передачи грязи становится менее явная руки-вилка-еда-организм...
И еще. Книжек, включая вышеуказанные, я прочел в достаточном количестве. Относительно А.Александреску - я уже высказывался - повторю. Обещание золотых гор нахаляву. Но только 1-2 человека из 10 способны уловить нюансы тех "академических извратов", которые там описаны. И только 1-2 из 10-ти человек уловивших эти нюансы могут правильно и к месту их происпользовать.
Более того, скажу, что буквально семь лет назад я был ярым противником использования ассертов. Типа только коды ошибок возвращаемые из функций, и try - catch. Тогда меня переубедить в чем то было просто невозможно.
Это я к тому, что узнавая что-то новое и "вкусное", человек попадает в некоторое состояние "эйфории" и думает что ЭТО "решает все проблемы". И я был не исключением. Одна из таких "эйфорий" это Александреску-мания. Я ей тоже переболел. Просто там написано все ТАК СЛОЖНО, что большинство просто не понимает или все время теряет мысль. Но все сложное манит. Человек думает что он ушербен, а Александреску - крут и начинается фанатично-религиозное использование всего что там написона и цитирование правил как из псалмов. Пример -(Стандарты программирования на С++. Г.Саттер, А.Александреску. Правило №0, пример 4) - ей богу напоминает ссылки в христианских брошурках.
Короче возникает культ.
Ну дак вот. переболел я этим самым. И щас понял, что основное - это уметь пользоваться всем. Причем самое ценное умение - выбирать средства адекватно поставленной задаче. Если надо сложить a+b, и человек использует шаблоны, STL и т.п., то это говорит о том, что человек уже не может без этой "наркоты".
Роман. У тебя хорошие желания, как и у всех программистов, вообщем как и у меня - писать что хочу, как хочу, чтоб это было удобно, не париться с поиском багов, чтоб их не было. Но чтобы этого достичь - как минимум надо соблюдать правила "гигиены написания кода", писать unit-тесты, рефакторинг и... короче много всего. Т.е. соблюдать все эти правила крайне сложно, но если это делать, то один раз отловить баг о close() - поверь во сто раз легче, чем отлавливать какой-нибудь нестабильный экзотический баг в шаблонном шаблоне рантайма.
Прошу у всех прощенья за стиль моего изложения мыслей, но уж таков я. Не хотел никого обидеть.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

И еще про правило конечного автомата - ставить assert-ы, на все необрабатываемые ветки конечного автомата. ЗОЛОТОЕ ПРАВИЛО - сохраняет тонны времени, ускоряет процесс разработки, не надо думать при написании основной ветки алгоритма, что делать если что-то не так, не боятся забыть/потерять ветку конечного автомата, которую Вы сейчас не хотите реализовывать, но потом ее надо бы сделать. Короче помогает как в отладке, так и не надо делать лишнию работу.
Пример:
pObj = NULL;
МУASSERT( acdbOpenObject(..., pObj) == Acad::eOk );
МУASSERT( pObj != NULL );
Пусть pObj == NULL в силу чего-то.
Можно вернуть код ошибки... Программа обрастает кодами ошибок и все это еще надо и обработать сверху. Обычно - вернули eNotOpen и сверху забили/забыли с проверкой - типа торопимся делать основную ветку алгоритма. Ничего хорошего и куча лишней работы и проблемы с отладкой через два дня, когда вдруг прилетело eNotOpen, а оно не обработалось...
Допустим мы попотеем и кинем исключение если pObj == NULL, во-первых надо не забыть поставить сверху try catch. Т.е. получается что наша программа обрастает try catch-ами с огромной силой - и вы просто запутаетесь в огромном количестве этих обработчиков и т.п.
Второй вариант - вы впарите только лишь в одно место try catch - где-нибудь с самого верха. Типа ресурсы у Вас написаны правильно на иу и они закроются. В этом случае получаем, что если где-то полетело ваше/чужое исключение, то вы сразу попадете в catch - сверху. Теперь представьте это отлаживать... сказали F10 на функции DoVeryComplexOp() - и оказались в catch сверху. Ну просто лафа... если там не стоит бряк поинт - то программа радостно отработала и вы можете не узнать что вылетело исключение.
А ну да... люди ведь рассуждают что для этого есть LOG - файл - в каждом catch - мы поставим вывод в лог.
Теперь запускаем программу, что-то делаем. Смотрим, ой у нас в логе сообщение.
"I am in catch in mainCommand.cpp line 140 Unknown or system exception". После такого сообщения хочется плакать...
Если на все "боковые" ветки поставить assert - то если Вы работаете в дебагере, и вылетело окошко с ассертом, то кроме указания файла и сторочки и условия что не так - вы сразу можете ткнуть паузе в дебаге, посмотреть стек, посмотреть переменные и в 99% СРАЗУ понять что к этому привело и исправить ошибку или сделать корректную обработку этой ветки конечного автомата.
Типа бесплатная лекция - почему не надо строить обработку внештатных ситуаций на try - catch. try-catch - надо ставить только на перехват системных или библиотечных исключений. Если этот catch случается - то это значит баг и что-то не так. Если вы кидаете исключение чтоб быстро выйти из рекурсии(встречал такое) или вернуть код ошибки и вы пишите не библиотеку для массового использования - то, скорее всего, вы не правы.
И как резюме - самое граммотное в обработке нештатных ситуаций - это использование комбинации ASSERT - на все нештатные ветки, try catch сверху - на "не свои" исключения в идеале происходить не должен коды программа отлажена, и возвращение кодов ошибок чтобы обрабатывать нужные "запланированные" ветки конечного автомата.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> KonstantinM
Я бы мог многое по этому поводу сказать, но уже бог с ним - тактика и стратегия использования исключений хорошо описана в литературе.
Всегод один вопрос: кто и зачем придумал такую гадость, как исключения? (и почему они нашли такое широкое распространение)
P.S. Даже не знаю почему, Вы ставите знак равенства между разработкой и отладкой... что, конечно, грустно...

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> archimag
----------
Всегод один вопрос: кто и зачем придумал такую гадость, как исключения? (и почему они нашли такое широкое распространение)
тактика и стратегия использования исключений хорошо описана в литературе.
----------
Всего один ответ - "Крестянин Иван придумал Болт и ищет куда его ввернуть" - примерно так и с исключениями.
Почему Вы решили, что я ставлю знак равенства между разработкой и отладкой? Более того нежелание использовать исключения растет из тех же эгоистичных побуждений разрабатывать быстрее и проще. 1) Легче кодировать. 2) Легче отлаживать 3) С юнит тестами и ассертами проще получать надежный и оттестированный код. Что еще надо?
А относительно МНОГИХ(подавляющее большинство) приложений под акад работающих с объектами - я заметил - включаем на заморозку слои и... обычно у всех просто падает Access Violation..., у меня хотя бы летит ассерт с указанием где не так. Очень быстро найти и поправить, что было доказано на прошлой недели.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> archimag
"Современное проектирование на С++"
Обобщенное программирование и прикладные шаблоны проектирования. Так называется эта книжка Александреску ...  читал ёе давно поэтому перепутал название. Насчёт того, что я могу понять и чего не могу, судить не вам. Я действительно "тормоз", но из моей немногочисленной группы, единственной в своём роде на всём потоке, только четверо дошли до диплома. И пусть я был последним, но всё-таки в этой четвёрке, как сказал дипломный руководитель, благодаря своей въедливости. Читать вам или нет книгу Джона Роббинса - ваше личное дело. Блок catch() он не рекомендует использовать потому, что во-первых, catch() переватывает не только исключения С++, но и исключения SEH, во-вторых, из-за отсутствия в catch() каких-либопеременных вы не сможете узнать, как вы очутились в этом блоке и почему. Далее пересказывать эту книгу у меня нет времени.
Думаю, что BS уже давно получил ответ на свой вопрос и я был первым , кто ему ответил, ответил правильно. Тема автора давно превратилась в "обмен любезностями" нескольких человек, считающими себя "гуру" на данной конференции. Себя таковым не считаю, поэтому в дальнейшей перепалке не учавствую. Удачи!

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> KonstantinM
Позволю себе привести цитату ещё одного классика:
"Механизм обработки исключений предоставляет альтернативу традиционным методам в тех случаях, когда они не достаточны, не элегантны и подвержены ошибкам. Он предоставляет способ явного отделения кода обработки ошибок от «обычного кода», делая таким образом программу более читабельной и лучше подходящей для различных инструментальных средств. Механизм обработки исключений предоставляет боле регулярный способ обработки ошибок, упрощая в результате взаимодействие между отдельно написанными фрагментами кода."
(Язык программирования С++, 3-изд, Б.Страуструп, гл. 14.1)
Тот стиль программирования, который Вы пропогандируете, характерен для языка "С с классами", а не для С++.
>1) Легче кодировать.
За счёт чего??? Наоборот.
>3) С юнит тестами и ассертами проще получать
> надежный и оттестированный код
Конечно проще, но...
Во-первых, автоматически выполняемые тесты могут покрыть только очень небольшую часть проблем при программировании под Автокад.
Во-вторых, у ассертов и исключений разное предназначение. Ассерты предназначены для выявления ситуаций, которые ВООБЩЕ НИКОГДА не дожны возникать. Если срабатывает ассерт, то это свидетельствует об ошибке в логике работы программы. Помимо этого, есть большое количество ошибок, которые не могут быть устранены на этапе компиляции и которые не обязательно приводят к завершению программы. В большинстве случаев, функция в которой произошла ошибка не знает что с ней делать и должна как-то сообщить об этом на более выскокий уровень. Для этого можно возращать код ошибки или генерировать исключение. Коды ошибок часто просто очень не удобны и их проверка может удвоить размер програмы, что затрудняет разработку, усложняет отладку, сопровождение и провоцирует ошибки (нужно писать много кода, это долго и нудно).
P.S. Заморозил пару слоёв - ничего необычного не заметил smile

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> Сергей
>из-за отсутствия в catch() каких-либо переменных
Как это? А как же само исключение? Если имеется ввиду конструкция catch(...) то с этим полностью согласен и никогда не использую эту возможность.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> archimag

> KonstantinM

> Сергей
"Религиозные войны - эпизод N". Как вы далеко убежали от вполне конкретного вопроса. :)

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> Александр
Ривилис
Ответ №1 Предположение.
Ответ №8 То же самое предположение, но уже более похожее на утверждение.
Оба являются правильным направлением для поиска ошибки, то есть являются ответом на поставленный вопрос в данной теме. №9 от автора темы это подтверждает. Собственно говоря, всё, что написано после не имеет к вопросу никакого отношения.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> Александр Ривилис
"Религиозные войны - эпизод N". Как вы далеко убежали от вполне конкретного вопроса. :)
Александр, :) ну что уж так сразу? Всегда получал от этого специфическое удовольствие. Возможны и мне скоро надоест этим заниматься - тем более делаю это не так часто. К тому же - когда оппоненты не спускаются к тупой полемике.
Архимаг:
Легче кодировать ПОТОМУ ЧТО:
MYASSERT( obj.open() == OK );
MYASSERT( dict->append(obj) == OK );
и т.д.
не надо думать о том, что будет если объект не откроется, если метод не выполниться, если... и т.д. - не надо писать исключения, не надо гемороится со всякими боковыми ветками, которые могут вообще никогда не случиться.
1) Просто логика программы упрощается до основной ветки, которую ты разрабатываешь. Если важно например, что объект не открылся - и надо что-то сделать корректное, то когда это случится прям при разработке, то ты это напишешь и профиксешь. В противном случае ты пишешь много кода, который обрабатывает исключения и ошибки, при этом этот код доходит до пользователя ни разу не быв исполненным и там запросто могут быть "описки" и баги.
2) Наличие кучи ассертов - это сравнимо с контрольными точками с диагностикой. Т.е. простым и дешовым способом навешиваются прямо при кодировании датчики что твой код исполняется как надо. И при работе программы если что-то пойдет не так то датчик сработает мгновенно по факту. Навешать такое кол-во исключений - это ж блин... я пытался...
3) MYASSERT - это не поганый майкрософтовский ассерт. Первое он работает и в дебаге и в релизе. Второе он показывает табличку что где-то что-то не так и дальше может кинуть то же самое исключение.
Эта вешь обсуждалась многократно - сразу отвечу на контрдоводы - 1) Критична производительность, а у Вас на каждую феньку навешан ассерт. 2) Критично что я работаю, а мне бац и вылетела табличка - все встало и ждет...
Для этих целей ассерт может быть настраиваемым. Т.е. в настройках программы можно настроить - исполнять ли CRITICALASSERT, показывать ли табличку пользователю - либо кинуть эксепшен, молча обработать его, если важна работоспособность и устойчивость программы во времени, ну и записать инфу в лог файл вместо того чтобы вывести это на экран.
Отмечу что для Автокадовских приложений пункт ни один и не два - не актуально.
И еще - Архимаг - твои мысли идентичны моим - три года назад. Поэтому я их ОЧЕНЬ хорошо понимаю. Я тоже наплевал на один ретерн из метода, когда ресурсы освобождаются в деструкторах. Сейчас в коде у меня у самого есть места где стоит по нескольку ретернов и дай бог что работает, но когда в методе появляется >=2 ретернов, то это верный знак что метод надо рефакторить.
И еще - что думают классики по каим-то вопросам я сам читал. Посему цитатами меня не напугать - у них там "наверху" споры не меньше наших. Гораздо интересней знать и видеть что думает сам человек и как это обосновывает не прибегая к банальному цитированию. Цитирование - это штамп, который вбивает в голову аксиому и человек перестает задумываться над проблематикой самостоятельно. У тебя же, архимаг, котелок неплохо варит. :) Прочитай что-нибудь по XProgramming - только осторожно, там религии тоже больше чем сути.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> BS.
Мне кажется, что в Вашей ситуации  может помочь использование менеджера  трансакций (acdbTransactionManager). При его использовании нет нужды следить за связкой open-close.  Достаточно открыть трансакцию (startTransaction) и после этого можно объект   «писать» или  «читать»  сколько угодно раз. «Закрывать» объект нет необходимости, достаточно после  всех манипуляций завершить (endTransaction) трансакцию.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

KonstantinM пишет:

Сейчас в коде у меня у самого есть места где стоит по нескольку ретернов и дай бог что работает, но когда в методе появляется >=2 ретернов, то это верный знак что метод надо рефакторить.

Неужели это так плохо как Вы говорите?
Если сравнить следующие куски кода:

if(){
    if(){
        if(){
        }
    }else
    {
    }
}
if(!) return;
if(!) return;
if(!) return
else

То как по мне второй читать намного легче первого. Где я програмирую естесвенный (оптимистически) поток событий. Все неудачи тут же прерывают этот поток и возвращают код ошибки или просто false.
получается легко и просто, а совместно с ИУ надежно. При этом заметьте - исключения не используются. Но в верхнеуровневых функциях как правило использую подобие Вашего assert работающего и в  release

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

:) Если наблюдается большая вложенность if-ов, for-ов..., то это признак того что метод надо рефакторить.
Посему второй вариант гораздо правильней. Более того есть такое правило (наверно читали тех же умных классиков) раз к нему опелируете, что метод должен быть короткий, простой и понятный.
Посему любой метод можно разбить (особенно когда становится много if-ов и условий внутри if-ов. Банальный пример с попаданием точки в прямоугольную область.
if ( isInsideRect(pt1, pt2, pt) )
{
}
bool isInsideRect(...)
{
   if ( pt1x < x и x > ptx2 )
      return false;
   if ( pt1y < y и y > pty2 )
      return false;
   return true;
}
В методе isInsideRect - стоит много ретернов, но они линейные и жизненно важные ресурсы не выделяются. И это второй вариант из приведенных вами.
В первом же варианте будет вложенность if-ов.
bool isInsideRect(...)
{
   if ( pt1x > x и x < ptx2 )
   {
      if ( pt1y > y и y < pty2 )
        return true;
   }
   return false;
}
Оба метода имеют право на существование и спорить какой их них красивей дело вкуса. Но оба они удовлетворяют правилам конечного автомата т.к. ресурсы не выделяются.
Если же ресурс выделяется из приведенного выше примера то метод можно отрефакторить до банальности просто.
void doOper(id)
{
   objref critRes = get...(id);
   try
   {
      doComplexNamedOperationWithResource(obj);
   }
   catch {
   }
   critRes.freeResource();
}
Если есть умный указатель можно сделать и с ним. Отличие лишь в том что    critRes.freeResource() писать не надо.
Опять же есть правила что есть ресурсы, которыми объект вдадеет, то этот объект их и освобождает в деструкторе. Если ресурс получен где-то и этот ресурс чей-то неизвестный, то все таки рекомендуется явно его закрыть. Хотя бы потому что при чтении программы видно, что тут мы ресурс захватили, а тут его освободили. Тут файл открыли тут закрыли, а вот Bitmap кнопки можно не убивать - пущай это делает кнопка т.к. это ее Bitmap.
Короче, соблюдение всех этих правил рекомендуется, но не обязательно. Т.е. соблюдая эти правила мы всего лишь уменьшаем кол-во граблей лежащих в темной комнате в неизвестных местах по которой мы ходим.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> KonstantinM
Мне не понравился последний пример. А что, если я не хочу в этой функции перехватывать никаких исключений? Обычно я перехватываю их на самых верхних эшелонах, потому как, обычная функция просто не знает что с ними делать. Есть тысячи причин, по которым во время выполнения функции может возбудиться исключение: его может кинуть мой код, его может кинуть какая-нибудь библиотека (а я стараюсь активно пользоваться сторонними библиотеками). Возможен, конечно, такой вариант:

try {
    // какой-то рабочий код
}
catch (...) {
   // очистка ресурсов
   throw;
}

Но, в этом случае эти блоки try-catch(...) мне нужно вставлять практически во все функции, что просто неприемлемо.
Вместо этого, я просто придерживаюсь правила, что любой ресурс должен кому-нибудь принадлежать. В этом случае, нет абсолютно никаких причин, иметь  только одну точку выхода.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

:)
Архимаг... абсолютно правильно мыслишь...  :)
Мне тоже эти catch-и парить во всех местах желания нет. Посему я тоже ставлю try catch только на "верхний эшелон", который перехватывает exception бросаемый ассертом. Кучи ассертов писать легко и полезно - решаются проблемы о которых я писал выше. Применение ИУ здесь очень кстати. Если выполнение пошло в режиме исключения, то ИУ - все закроют при этом открываться и еще что либо делаться не будет, а если исполнение идет в штатном режиме, то рулить критическими ресурсами надо все таки лучше руками (причем расставление скобочек области видимости - это тоже своего рода - рулить руками).
Это и есть пример комплексного подхода, где все используется и все к месту. Если почитать выше именно про это я и писал, что и исключения и ассерты и ИУ - нужны, только самое трудное это все вместе правильно происпользовать в комплексе.
Опять же плодить свои разношерстные исключения не надо. Это лишний гемор. Достаточно одного исключения, который кидается ассертом. Это исключение должно быть перехвачено ближайшем блоком транзакции, а не просто с "самого верха", но про это уже писать лень.
Я хотел объяснить то, что юзать кучи ассертов тоже полезно, что если есть черезмерное кол-во ретернов и вложенность if-ов, то надо рефакторить, а не ссылаться на то что так читать и писать проще, наоборот, как раз проще читать и понимать код, когда вложенность небольшая и отсутствует куча нелинейных(вложенных) ретернов в перемешку с выделением ресурсов. Такой метод всегда можно отрефакторить в более прозрачную сторону. При этом побоку используете или нет вы ИУ для ресурсов.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> KonstantinM
И до чего мы договорились? smile
Похоже, что хватит... Пожалуй, подытожу всё ещё одной цитатой smile
"Ничто не заменит ума, опыта и хорошего вкуса" (Б.Стауструп)

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

Вопрос ко всем участникам диспута, за которым я с интересом слежу.
Прошу не воспринимать его как этакий "взгляд с высока".
Если это не секрет, скажите пожалуйста, каков размер приложений (строк Вашего кода)?
Скольких пользователей Вам приходится сопровождать удаленно (и как это происходит)?

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> VVV
>VVV Спасибо. В сущности, я сообщил Сергею в чем была проблема, которая вызвала подобное сообщения AutoCAD. У меня это произошло первый раз. Мне кажется, что уловить связь между выэовом чистой виртуальной функции
и незакрытым объектом, непросто. Почему бы не сообщить что какой-то объект не закрыт? Вообще Autodesk создав такую приличную библиотеку как ObjectARX, не дала инструментов для работы с ней. Почему бы не создать спец. надстройку к дибагеру, создать нечто подобное Intellsence и т.д. Инструкций по технике программирования, описание и толкование сообщений. Каждый выкручивается как может. Вся эта дискуссия, это обсуждение способов как обойти все эти проблемы всеми известными способами. У каждого свой рецепт. У всех золотые головы. А почему бы не придумать небольшую надстройку над VC? И утереть нос Autodesk?

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

> Michael
Наш текущий проект сейчас около 20 000 строк, думаю, что в итоге этот размер удвоится.

> BS
Я бы не назвал ObjectArx хорошей библиотекой smile На самом деле, она отвратительна...
Это просто невозожно. Существует реальная архитектура, судя по всему, довольно кривая, многкратно правленная, в ней чёрт ногу сломит. Вносить серьёзные изменения в неё черезвычайно дорого. За любую подобную фичу надо платить, при чём, быстродействием, а у Автокада с этим и так серьёзные проблемы. Да и зачем? Интелектуальные указатели были специально придуманы (и поддерживаются стандартом) для решения подобных проблем.

Re: Сообщения AutoCAD: "ENTERNAL ERROR: !U:\... dbobji.cpp@5619:eNotOpenForWrite" и "Error handler re-entered. Exiting now."

Строки не считал.
В одном проекте уже под 6000 файлов. В другом 1000 файлов. Ну разделить это на 5-ть и помножить на 50-т строк в файле. Но главное не в размере :) в том, что на своей шкуре прочувствовал поддержку, доработку и рефакторинг кода, который был писан от полугода и более трех лет назад - то еще развлечение - посему писать новый код и поддерживать/развивать старый - это две большие разницы. При этом относительно недавно осознал, что при написании нового кода - ой как надо думать о том, как все это безобразие надо будет перешерстить через год - два.