2010-09-28 1 views
7

Мы реализуем оболочку кода C++ для воздействия на Java-клиентов. Я видел SWIG documents about exception handling, но что это означает для кодирования в трех слоях (C++/SWIG/Java)?Как обрабатывать исключения из C++ через SWIG в Java

Если у кого-нибудь есть рабочий пример или совет, я был бы признателен.

ответ

4

Так как я боролся с этим (см мой блог из своего профиля, это на Python, SWIG, исключений и директоров, но должно помочь), позвольте мне дать вам несколько советов:

  1. Дон» t отправляет исключения C++ до стека Java. Это приведет к сбою вашего приложения. Убедитесь, что все они завернуты правильно. Я знаю, что вы спрашиваете об этом, но это действительно необходимо, чтобы вы это получили. Одно пропущенное исключение может все это сделать.
  2. Не пытайтесь передавать исключения Java до стека C++, они преобразуются в SWIGDirectorExceptions или SWIGMethodExceptions. Это настоящая боль, потому что вы потеряете информацию о типе в исключении Java. Вместо этого, если вы не имеете дело с директором, создайте класс C++, который не более чем создает исключения C++, чтобы вы могли распространять исключения C++ по стеку C++.
  3. Оберните все голые строки, переданные с Java на C++ в std :: string. Если вы сохраните их как указатели const char, у Java будет возможность собирать мусор. Это относится ко всем предметам, но это настолько легко упускается из виду, что я сделал это и видел, как это делалось несколько раз.

После этого не читайте 1.1. Используйте документацию с 2.0 или 1.3. Это намного яснее.

+0

Я очень ценю подробную обратную связь. Вы, по-видимому, всемирный эксперт по этой теме, поздравляю. –

+0

@Steve Townsend LOL, нет! Я только что использовал SWIG с Python и Java. Мне также просто приходилось записывать свой опыт с другими, чтобы они могли извлечь выгоду из моей боли. – wheaties

+0

Спасибо за это. – JamesC

7

См. Также в документации Swig 2.0 Java-specific section on exception handling.

Чтобы избежать написания шаблона более чем один раз, я создал SWIG макрокоманду поддержку методов, которые бросают один тип C исключение ++ - ловлей, что и бросание соответствующий Java исключение:

WRAP_THROW_EXCEPTION(myCppDeclaration, com::foo::MyCppExceptionClass, 
    "com.foo.MyException", 
    "com/foo/MyException"); 

Вот макрос:

%define WRAP_THROW_EXCEPTION(MATCH, CPPTYPE, JTYPE, JNITYPE) 
%javaexception(JTYPE) MATCH { 
    try { 
    $action 
    } 
    catch (CPPTYPE & e) { 
    jclass eclass = jenv->FindClass(JNITYPE); 
    if (eclass) { 
     jenv->ThrowNew(eclass, e.what()); 
    } 
    } 
} 
%enddef 
+0

Спасибо за указатель Andy –

+0

Добро пожаловать! Я знаю, что ваш вопрос несколько месяцев, но я хотел добавить это для будущих читателей. –

Смежные вопросы