Доброго времени суток,
прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей. Правильно ли я понимаю, что и сегодня единственным способом уведомления об ошибке во внешнем модуле остается возврат кодов ошибок.
Здравствуйте, cyberzlodey, Вы писали:
C>Доброго времени суток, C>прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей.
Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?
>Правильно ли я понимаю, что и сегодня единственным способом уведомления об ошибке во внешнем модуле остается возврат кодов ошибок.
Не только. Вот пример из MFC с исключением
CFile::Open
Open is designed for use with the default CFile constructor.
Open can still initialize a CFileException object to describe the error, however. If you don't supply the pError parameter, or if you pass NULL for pError, Open will return FALSE and not throw a CFileException. If you pass a pointer to an existing CFileException, and Open encounters an error, the function will fill it with information describing that error. In neither case will Open throw an exception
Обрати внимание : Open никогда не выбрасывает исключение, но возвращает его.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?
это из какой функции crt такое может прилететь?
PD>Обрати внимание : Open никогда не выбрасывает исключение, но возвращает его.
код ошибки, по сути, ничем не отличается от объекта с информацией об ошибке.
Здравствуйте, cyberzlodey, Вы писали:
C>прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей. Правильно ли я понимаю, что и сегодня единственным способом уведомления об ошибке во внешнем модуле остается возврат кодов ошибок.
Исключения могут пересекать границы модулей при соблюдении техники безопасности.
Если и exe, и подгружаемые модули создаются одним компилятором, используют один рантайм, если при раскрутке стека dll не будет выгружена, то нет причин ограничивать себя.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, cyberzlodey, Вы писали:
C> Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей.
как я понимаю, слышал что вроде на винде так нелья, речь про виндовс? )
ну я понимаю, что default city на этом форуме msk, я может чего-то пропустил или венда у нас стала default platform в профильных форумах?? -- что ни сообщение с OS dependent проблемой, так авторы то ли забывают написать (не думают когда пишут?), то ли подразумевают default...
On 10.08.2011 10:48, cyberzlodey wrote:
> возникает ошибка, которую нужно как то обработать. Как я понимаю кидать > исключение — не вариант, поскольку они не должны пересекать границы модулей.
Понимаешь неправильно. Никто тебе не мешает кидать исключения хоть внутри
модулей, хоть снаружи.
> Правильно ли я понимаю, что и сегодня единственным способом уведомления об > ошибке во внешнем модуле остается возврат кодов ошибок.
Здравствуйте, alsemm, Вы писали:
A>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ? A>это из какой функции crt такое может прилететь?
operator new
PD>>Обрати внимание : Open никогда не выбрасывает исключение, но возвращает его. A>код ошибки, по сути, ничем не отличается от объекта с информацией об ошибке.
Как сказать... Теоретически — да, а практически исключение может быть удобнее. Впрочем, я отнюдь не настаиваю, я и сам не большой их поклонник. Я просто привел возможный вариант FYI.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, alsemm, Вы писали:
A>>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ? A>>это из какой функции crt такое может прилететь?
PD>operator new
а, ну да. но crt — это особый случай. без той crt, с которой программа собиралась, она не запустится. а скажем, система, в которой предусмотрено расширение функциональности через dll-плагины грохнется, если из какого-то плагина вылетит исключение, а он, к примеру, собран был другим компилятором.
Здравствуйте, alsemm, Вы писали:
A>а, ну да. но crt — это особый случай. без той crt, с которой программа собиралась, она не запустится. а скажем, система, в которой предусмотрено расширение функциональности через dll-плагины грохнется, если из какого-то плагина вылетит исключение, а он, к примеру, собран был другим компилятором.
Верно. Более того, он может быть и на другом языке написан. В этом случае, конечно, выпускать исключения за пределы модуля нельзя, но ведь и невозможно — в EXE , может быть, его и в принципе не могли бы перехватить, если там ничего не знают про PluginException.
Здравствуйте, MasterZiv, Вы писали:
MZ>On 10.08.2011 10:48, cyberzlodey wrote:
>> Как я понимаю кидать >> исключение — не вариант, поскольку они не должны пересекать границы модулей.
MZ>Понимаешь неправильно. Никто тебе не мешает кидать исключения хоть внутри MZ>модулей, хоть снаружи.
Собственно мое, возможно не верное, понимание родилось после прочтения C++ Coding Standards:101 Rules, Guidelines, and Best Practices by Herb Sutter and Andrei Alexandrescu и в частности главы 62 Don’t allow exceptions to propagate across module boundaries. Там говорится о том, что даже различные опции компиляции могут повлиять на кроссмодульную обработку исключений непредсказуемым образом.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, cyberzlodey, Вы писали:
C>>Доброго времени суток, C>>прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей.
PD>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?
Все зависит от того, используется ли всеми компонентами одна и та же версия рантайма или нет.
Здравствуйте, cyberzlodey, Вы писали:
C>Здравствуйте, MasterZiv, Вы писали:
MZ>>On 10.08.2011 10:48, cyberzlodey wrote:
>>> Как я понимаю кидать >>> исключение — не вариант, поскольку они не должны пересекать границы модулей.
MZ>>Понимаешь неправильно. Никто тебе не мешает кидать исключения хоть внутри MZ>>модулей, хоть снаружи.
C>Собственно мое, возможно не верное, понимание родилось после прочтения C++ Coding Standards:101 Rules, Guidelines, and Best Practices by Herb Sutter and Andrei Alexandrescu и в частности главы 62 Don’t allow exceptions to propagate across module boundaries. Там говорится о том, что даже различные опции компиляции могут повлиять на кроссмодульную обработку исключений непредсказуемым образом.
там все правильно написано. В с++ модули в стандарте почти не упоминаются и сборка проекта на С++ из модулей собранных с разными компиляторами и/или опциями это классический ссзб. "Исключением" (оксюморон) являются стандартные правила бинарной совместимости на платформе, которые сводятся или к сишному апи или COM или что там поставщик платформы поддерживает еще
так что или вы рулите всеми опциями и компиляторами или модули ограничиваются и не используют на границе ничего из С++