Неперехваченное исключение в обратном вызове из сторонней статической библиотеки

Я компилирую свою программу со сторонней библиотекой. Эта библиотека содержит обратный вызов ошибки, если ошибка возникает внутри. Внутри этого обратного вызова ошибки я выбрасываю исключение, и у меня есть модульный тест, чтобы убедиться, что когда я делаю что-то недопустимое, возникает исключение. Все это прекрасно работает в Windows, но когда я тестирую это в Linux (Fedora), я получаю прерывание из-за неперехваченного исключения.

Я попытался обернуть свой вызов напрямую блоком try-catch, но безуспешно. (Кроме того, весь мой код работает в тестовой среде Google, которая также обычно перехватывает исключения). Единственное, что, кажется, перехватывает исключение, это если я оборачиваю оператор throw в блок try непосредственно в обратном вызове ошибки.

Кто-нибудь знает, почему это произойдет и есть ли способ поймать исключение?


person drewag    schedule 06.06.2011    source источник


Ответы (2)


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

int yourCallback( params )
{
    try {
      doStuff( params );
      return Okay;
    } catch (...) {
      return Error;
    }
}

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

Если вы не уверены, что код может работать с вашими исключениями, вы не можете распространять исключения в сторонний код. Крайним примером является COM, где ваш код и «другой код» могут быть на любом языке и с любой средой выполнения, и вам не разрешено распространять исключения через границу COM.

person sharptooth    schedule 06.06.2011
comment
Спасибо за ответ, это имеет смысл. - person drewag; 06.06.2011

Обычно вы не должны генерировать исключения «сквозь» код, о котором вы ничего не знаете. Это может быть код на C, который даже не уберет за собой.

Чтобы решить вашу конкретную проблему, потребуется конкретная информация о сторонней библиотеке, с которой вы взаимодействуете. Для чего нужен этот обратный вызов? Чтобы дать вам шанс исправить вещи? Чтобы сообщить вам, что произошла ошибка? Можете ли вы отменить любую операцию, из которой он вызывается?
Один из способов справиться с таким сценарием — сохранить некоторую информацию где-то при вызове обратного вызова и проверить эту информацию, когда фактическая обработка завершится из вашей функции, которая вызывает эту библиотеку. .

person sbi    schedule 06.06.2011
comment
Я думаю, что это почти определенно проблема. Это библиотека C. Тем не менее, я думаю, я просто смущен, почему Windows может справиться с этим, а Linux - нет? - person drewag; 06.06.2011
comment
@drewarg: Какова бы ни была причина, вы не должны зависеть от этого - пожалуйста, найдите время, чтобы прочитать ответ на вопрос, на который я ссылаюсь. - person sharptooth; 06.06.2011
comment
@drewag: я бы не знал. Но создание исключений C++ через код C, скорее всего, в любом случае вызовет неопределенное поведение, поэтому все, что происходит, правильно. - person sbi; 06.06.2011
comment
Обратный вызов ошибки в основном просто дает некоторые строки, описывающие, что произошло, но каждая функция, которая вызывает это, также возвращает код ошибки, поэтому я думаю, что мне просто придется обработать его там. Я надеялся иметь общий способ обработки всех ошибок, которые проходят через этот обратный вызов, но позволить другим вызовам переопределять это поведение по умолчанию, перехватывая исключение раньше. В целом, любой возникающей ошибки следует избегать путем проверки ввода перед вызовом функций, поэтому я, вероятно, просто пойду по этому пути. Спасибо за помощь! - person drewag; 06.06.2011