Как обрабатывать исключения из C ++ через SWIG в Java - PullRequest
7 голосов
/ 28 сентября 2010

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

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

Ответы [ 2 ]

8 голосов
/ 11 ноября 2010

См. Также в документации по Swig 2.0 этот специфичный для Java раздел по обработке исключений .

Чтобы избежать написания шаблона более одного раза, я создал макрос 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
4 голосов
/ 09 ноября 2010

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

  1. Не отправляйте исключения 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. Это намного понятнее.

...