В настоящее время я пишу класс оболочки, основанный на ObjectWrap для библиотеки линейной алгебры Armadillo. Я заметил, что, когда исключение испускается из armadillo, оно не попадает в дополнительный код, даже когда я пытаюсь обработать исключение:
if(args[0].isString()){
try{
std::string s(*v8::String::AsciiValue(args[0]->ToString()));
MatrixWrap* matrix = new MatrixWrap(s);
matrix->Wrap(args.This());
}catch(exception& e){
cout << "caught exception" << endl; // this code is never called.
}
}
Соответствующий соответствующий конструктор приведен ниже (_matrix - это экземпляр arma :: mat и генерирует исключение, если строка не правильно отформатирована):
MatrixWrap::MatrixWrap(string s):_matrix(s){
}
Когда я запускаю код, я получаю следующий вывод:
> var arma = require('./build/Release/armadillo');
> var matrix = new arma.Matrix('1 0; 0 1');
> matrix.print();
1.0000 0
0 1.0000
> var B = new arma.Matrix('1 0; 0');
error: Mat::init(): inconsistent number of columns in given string
libc++abi.dylib: terminate called throwing an exception
Abort trap: 6
Как будто исключение не обрабатывается, несмотря на предложение catch
Вместо catch (exception & e) попробуйте использовать catch (...), который должен поймать все исключения.
В зависимости от ошибки Armadillo бросает std :: logic_error, std :: bad_alloc или std :: runtime_error
Модифицированный скрипт сборки для включения обработки исключений:
{
"targets": [
{
'target_name': 'armadillo',
'sources':[ "src/addon.cpp", "src/MatrixWrap.cpp"],
'link_settings': {
'libraries': ['-larmadillo']
},
'cflags': ['-fexceptions'],
'cflags_cc': ['-fexceptions']
}
]
}