распространение исключений во внешне связанных библиотеках C - PullRequest
4 голосов
/ 20 декабря 2010

Я пишу библиотеку C ++, которая использует внешнюю стороннюю библиотеку C. Таким образом, моя библиотека будет вызывать функции в этой сторонней библиотеке, а сторонняя библиотека будет перезванивать в другую часть моей библиотеки.

Мне интересно, что происходит с исключениями в этом случае? Скажем, MyLib :: foo () вызывает функцию внешней библиотеки C, которая в конечном итоге вызывает MyLib :: bar (), и bar вызывает исключение, что происходит? Будет ли исключение правильно передано обработчику в foo ()?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 20 декабря 2010

Будет ли исключение правильно передано обработчику в foo()?

Я думаю, что распространение исключений через внешний код C не определено. Что еще хуже, код C не подготовлен и не может обработать исключение. Код C не нуждается в защите от внезапных, неожиданных возвратов, поэтому он не знает RAII и т. Д.

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

1 голос
/ 20 декабря 2010

Прочитайте (и купите!) Стандарты кодирования Херба Саттера C ++

# 62: Не допускайте распространения исключений через границы модуля.

1 голос
/ 20 декабря 2010

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

На всякий случай, если это Windows, код C действительновыстрел в это.Исключения в C ++ поддерживаются универсальной поддержкой исключений, встроенной в Windows, которая называется Структурная обработка исключений (SEH).Вы используете ключевые слова __try и __except для вызова фильтра исключений, который может восстановить состояние кода C.Очевидно, что это не переносимо.

Никогда не задавайте вопрос о деталях реализации, не упоминая детали реализации, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...