2010-09-28 8 views

Respuesta

4

Desde He luchado con esto (ver mi blog de mi perfil, que es el pitón, TRAGO, excepciones y directores, pero debería ayudar) te voy a dar un par de consejos:

  1. Don' Enviar excepciones de C++ a la pila de Java. Se bloqueará tu aplicación. Asegúrate de que estén todos envueltos de la manera correcta. Sé que estás preguntando sobre esto, pero es realmente imprescindible que lo entiendas. Una excepción perdida puede mancillarlo todo.
  2. No intente pasar excepciones de Java a la pila de C++, se convierten a SWIGDirectorExceptions o SWIGMethodExceptions. Es un verdadero dolor porque pierdes información de tipo sobre la excepción de Java. En cambio, si no está tratando con un director, cree una clase de C++ que no haga más que elevar las excepciones de C++ para que pueda propagar excepciones de C++ a lo largo de la pila de C++.
  3. Ajustar todas las cadenas desnudas pasadas de Java a C++ en std :: string. Si los mantiene como const char punteros Java tendrá la opción de recogerlos basura. Esto es cierto para todos los artículos, pero es tan fácil pasar por alto que lo he hecho y lo he visto varias veces.

Después de eso, no lea 1.1. Use la documentación de 2.0 o 1.3. Es mucho más claro.

+0

Realmente agradezco los comentarios detallados. Aparentemente eres el experto mundial en este tema, felicitaciones. –

+0

@Steve Townsend lol, no! Acabo de usar SWIG con Python y Java. También casualmente escribí mis experiencias con otros para que puedan beneficiar/compartir mi dolor. – wheaties

+0

Gracias por esto. – JamesC

7

Consulte también en la documentación de Swig 2.0 este Java-specific section on exception handling.

Para evitar escribir el patrón más de una vez, he creado una macro TRAGO apoyar métodos que arrojan un tipo de excepciones de C++ - por la captura de eso y tirar la correspondiente excepción de Java:

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

Aquí está la macro:

%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

Gracias por el puntero Andy –

+0

De nada! Sé que su pregunta tiene algunos meses, pero quería agregar esto para futuros lectores. –

Cuestiones relacionadas