Я пишу пользовательский класс исключений C ++ (чтобы я мог передавать исключения, возникающие в C ++, на другой язык через C API).
Мой первоначальный план атаки заключался в следующем:
//C++
myClass
{
public:
myClass();
~myClass();
void foo() // throws myException
int foo(const int i, const bool b) // throws myException
} * myClassPtr;
// C API
#ifdef __cplusplus
extern "C" {
#endif
myClassPtr MyClass_New();
void MyClass_Destroy(myClassPtr p);
void MyClass_Foo(myClassPtr p);
int MyClass_FooBar(myClassPtr p, int i, bool b);
#ifdef __cplusplus
};
#endif
Мне нужен способ передать исключения, сгенерированные в коде C ++, на сторону C. Информация, которую я хочу передать стороне C, следующая:
(а). Какие
(Б). куда
(С). Простая трассировка стека (просто последовательность сообщений об ошибках в порядке их появления, отсутствие отладочной информации и т. Д.)
Я хочу изменить мой C API, чтобы функции API брали указатель на структуру ExceptionInfo, которая будет содержать любую информацию об исключении (если возникло исключение) до использования результатов вызова.
Таким образом, метод C ++, представленный в C API, будет реализован примерно так:
// Я должен признать, что есть что-то странно «хакерское» в реализации такого рода (за исключением кошмара обслуживания) - должен ли быть лучший способ?
// ExceptionInfo default ctor initialized to no error
void MyClass::foobarTrappedExceptionWrapper(ExceptionInfo& ei)
{
try {
// call foobar ...
foobar();
}
catch(fast_exception& fe)
{
switch (fe.errcode())
{
//package exception info into ei for C consumption
}
}
catch(std::exception &e)
{
//package exception info into ei for C consumption
}
}
Реализация каждого из методов C ++, представленных в C API, должна быть заключена в оператор try / catch (см. Фрагмент выше). Влияние производительности на это кажется довольно серьезным (согласно этой статье ):
"Это ошибка (с большим временем выполнения
стоимость) использовать обработку исключений C ++
для событий, которые происходят часто, или
для событий, которые обрабатываются рядом с
Точка обнаружения. "
В то же время я помню, как читал где-то в мои дни на С ++, что, хотя обработка исключений стоит дорого, она становится дорогой только тогда, когда действительно происходит исключение. Итак, что правильно? что делать?. Есть ли альтернативный способ, которым я могу безопасно перехватывать ошибки и передавать полученную информацию об ошибках в C API ?. Или это незначительное соображение (в конце концов, статья довольно старая, и с тех пор аппаратные средства немного улучшились).
[Изменить]
Удален вопрос2, поскольку я нашел способ создать простую трассировку стека здесь .