Необработанное исключение при обратном вызове из сторонней статической библиотеки - PullRequest
0 голосов
/ 06 июня 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

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

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

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

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

1 голос
/ 06 июня 2011

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

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

...