При взаимодействии между C и C++ в контексте обработки исключений следует учитывать:
- Пересечение границ языков. Исключения C++ не могут пересекать границы функций с
extern "C" linkage. Это приводит к undefined behavior.
- Несовместимость механизмов. C не имеет встроенного механизма обработки исключений (как
try-catch в C++), полагаясь на коды ошибок или setjmp/longjmp.
- Безопасность исключений. C++-код, вызывающий C-функции, должен быть готов к тому, что эти C-функции могут не быть exception safe. Они не вызывают деструкторы локальных объектов C++ при выходе через
longjmp.
- Захват исключений. Необходимо использовать C++
try-catch блоки для обработки исключений C++ до вызова C-функций или после возврата из них.
- Передача состояния ошибки. C-функции должны возвращать коды ошибок, которые C++-код затем может конвертировать в исключения, если это необходимо.
- Обратные вызовы (callbacks). Если C-функции используют C++-коллбеки, эти коллбеки должны ловить любые C++ исключения внутри себя, чтобы исключение не вышло наружу через C-код.
- Использование
noexcept. C++11 позволяет явно помечать функции как noexcept, что может быть важно при вызове C-функций или функций с extern "C", гарантируя, что эти функции не бросают исключений.
Пример, демонстрирующий проблему пересечения границ:
c