межмодульная обработка ошибок
От: cyberzlodey  
Дата: 10.08.11 06:48
Оценка:
Доброго времени суток,
прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей. Правильно ли я понимаю, что и сегодня единственным способом уведомления об ошибке во внешнем модуле остается возврат кодов ошибок.
error handling
Re: межмодульная обработка ошибок
От: Pavel Dvorkin Россия  
Дата: 10.08.11 10:21
Оценка:
Здравствуйте, cyberzlodey, Вы писали:

C>Доброго времени суток,

C>прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей.

Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?

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


Не только. Вот пример из MFC с исключением

CFile::Open
Open is designed for use with the default CFile constructor.

virtual BOOL Open(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CFileException* pError = NULL
);

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 никогда не выбрасывает исключение, но возвращает его.
With best regards
Pavel Dvorkin
Re[2]: межмодульная обработка ошибок
От: alsemm Россия  
Дата: 10.08.11 10:30
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?

это из какой функции crt такое может прилететь?

PD>Обрати внимание : Open никогда не выбрасывает исключение, но возвращает его.

код ошибки, по сути, ничем не отличается от объекта с информацией об ошибке.
Re: межмодульная обработка ошибок
От: Stanislav V. Zudin Россия  
Дата: 10.08.11 10:44
Оценка: 1 (1) +3
Здравствуйте, cyberzlodey, Вы писали:

C>прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей. Правильно ли я понимаю, что и сегодня единственным способом уведомления об ошибке во внешнем модуле остается возврат кодов ошибок.


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

Если и exe, и подгружаемые модули создаются одним компилятором, используют один рантайм, если при раскрутке стека dll не будет выгружена, то нет причин ограничивать себя.
_____________________
С уважением,
Stanislav V. Zudin
Re: [offtop] межмодульная обработка ошибок
От: zaufi Земля  
Дата: 10.08.11 10:45
Оценка:
Здравствуйте, cyberzlodey, Вы писали:

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

как я понимаю, слышал что вроде на винде так нелья, речь про виндовс? )

ну я понимаю, что default city на этом форуме msk, я может чего-то пропустил или венда у нас стала default platform в профильных форумах?? -- что ни сообщение с OS dependent проблемой, так авторы то ли забывают написать (не думают когда пишут?), то ли подразумевают default...
Re: межмодульная обработка ошибок
От: MasterZiv СССР  
Дата: 10.08.11 11:06
Оценка:
On 10.08.2011 10:48, cyberzlodey wrote:

> возникает ошибка, которую нужно как то обработать. Как я понимаю кидать

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

Понимаешь неправильно. Никто тебе не мешает кидать исключения хоть внутри
модулей, хоть снаружи.

> Правильно ли я понимаю, что и сегодня единственным способом уведомления об

> ошибке во внешнем модуле остается возврат кодов ошибок.

Нет.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: межмодульная обработка ошибок
От: Pavel Dvorkin Россия  
Дата: 10.08.11 11:38
Оценка:
Здравствуйте, alsemm, Вы писали:

A>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?

A>это из какой функции crt такое может прилететь?

operator new

PD>>Обрати внимание : Open никогда не выбрасывает исключение, но возвращает его.

A>код ошибки, по сути, ничем не отличается от объекта с информацией об ошибке.

Как сказать... Теоретически — да, а практически исключение может быть удобнее. Впрочем, я отнюдь не настаиваю, я и сам не большой их поклонник. Я просто привел возможный вариант FYI.
With best regards
Pavel Dvorkin
Re[4]: межмодульная обработка ошибок
От: alsemm Россия  
Дата: 10.08.11 12:46
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, alsemm, Вы писали:


A>>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?

A>>это из какой функции crt такое может прилететь?

PD>operator new

а, ну да. но crt — это особый случай. без той crt, с которой программа собиралась, она не запустится. а скажем, система, в которой предусмотрено расширение функциональности через dll-плагины грохнется, если из какого-то плагина вылетит исключение, а он, к примеру, собран был другим компилятором.
Re[5]: межмодульная обработка ошибок
От: Pavel Dvorkin Россия  
Дата: 10.08.11 12:51
Оценка:
Здравствуйте, alsemm, Вы писали:

A>а, ну да. но crt — это особый случай. без той crt, с которой программа собиралась, она не запустится. а скажем, система, в которой предусмотрено расширение функциональности через dll-плагины грохнется, если из какого-то плагина вылетит исключение, а он, к примеру, собран был другим компилятором.


Верно. Более того, он может быть и на другом языке написан. В этом случае, конечно, выпускать исключения за пределы модуля нельзя, но ведь и невозможно — в EXE , может быть, его и в принципе не могли бы перехватить, если там ничего не знают про PluginException.
With best regards
Pavel Dvorkin
Re[2]: межмодульная обработка ошибок
От: cyberzlodey  
Дата: 10.08.11 15:59
Оценка: +1
Здравствуйте, 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. Там говорится о том, что даже различные опции компиляции могут повлиять на кроссмодульную обработку исключений непредсказуемым образом.
Re[2]: межмодульная обработка ошибок
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.08.11 16:27
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, cyberzlodey, Вы писали:


C>>Доброго времени суток,

C>>прошу поделиться опытом по правильной обработке ошибок в многокомпонентном с++ приложении. В частности, немного упрощенный пример: исполняемый файл загружает динамическую библиотеку, затем в ходе работы в одной из библиотечных функций возникает ошибка, которую нужно как то обработать. Как я понимаю кидать исключение — не вариант, поскольку они не должны пересекать границы модулей.

PD>Вообще-то не слишком убедительно. Как, например, насчет bad_alloc, которое выбрасывается в DLL CRT C++, а ловится в EXE ?

Все зависит от того, используется ли всеми компонентами одна и та же версия рантайма или нет.
Маньяк Робокряк колесит по городу
Re: межмодульная обработка ошибок
От: Tujh Голландия  
Дата: 11.08.11 08:39
Оценка:
Здравствуйте, cyberzlodey, Вы писали:

Возможно не совсем правильный ответ, но вот это смотрели ?
SetUnhandledExceptionFilter
SetUnhandledExceptionFilter and the C/C++ Runtime Library
Re[3]: межмодульная обработка ошибок
От: SleepyDrago Украина  
Дата: 11.08.11 19:41
Оценка:
Здравствуйте, 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 или что там поставщик платформы поддерживает еще
так что или вы рулите всеми опциями и компиляторами или модули ограничиваются и не используют на границе ничего из С++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.