См. Также в документации по 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