исключение не обнаружено в дополнении node.js

0

В настоящее время я пишу класс оболочки, основанный на 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

Теги:
exception
armadillo

2 ответа

1
Лучший ответ

Вместо catch (exception & e) попробуйте использовать catch (...), который должен поймать все исключения.

В зависимости от ошибки Armadillo бросает std :: logic_error, std :: bad_alloc или std :: runtime_error

  • 0
    Я пытался это изначально, но почему-то кажется, что исключение просто не перехватывается и распространяется, пока приложение не будет завершено
  • 0
    Странный. Попробуйте реорганизовать ваш код, чтобы минимизировать использование указателей (например, не выполняйте ручное управление памятью; уменьшайте или удаляйте вызовы new , delete , malloc () , free () и т. Д.). Указатели низкого уровня и очень подвержены ошибкам. Они могут привести к появлению ошибок далеко от того места, где находится настоящая проблема.
Показать ещё 3 комментария
1

Модифицированный скрипт сборки для включения обработки исключений:

{
    "targets": [
        {
            'target_name': 'armadillo',
            'sources':[ "src/addon.cpp", "src/MatrixWrap.cpp"],
            'link_settings': {
                'libraries': ['-larmadillo']
            },
            'cflags': ['-fexceptions'],
            'cflags_cc': ['-fexceptions']
        }
   ]
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню