Только что начал работать с библиотекой Armadillo. В документации и FAQ я не нашел ссылок на то, как Armadillo обрабатывает ошибки. Например, как мне узнать, успешно ли выполнено "mat A(1e10, 1e10)"?
Как библиотека Armadillo обрабатывает ошибки?
Ответы (2)
Механизм обработки ошибок Armadillo не ясен из его документации. Из общения по электронной почте с автором Сандерсоном выяснилось, что механизм обработки ошибок Armadillo на самом деле представляет собой смесь стандартного исключения C++ и возвращаемого значения в стиле C. Однако информация о том, какое исключение будет выброшено, в документации все еще неполная.
Например, чтобы определить матрицу, я предлагаю не использовать «mat X (M, N)», потому что обработка ошибок отсутствует. Безопасный способ такой (стиль C):
mat X;
try{
X.set_size(M, N);
} catch (...) {
printf("memory allocation failed\n");
return -1;
}
Обратите внимание, что при возникновении ошибки выделения памяти будет выброшено исключение "std::logic_error" или "std::bad_alloc" (см. комментарий ниже от mtall), это не указано в документации. При возврате используйте «X.reset()», чтобы освободить память данных.
И @mtall: Я полагаю, что менее жесткое отношение к новичкам в конкретной области лучше для здоровья сообщества. Заставлять других читать неполную документацию — неконструктивное мнение. На самом деле, большинство хороших проектов с открытым исходным кодом поставляются с не очень хорошей документацией, поэтому мы должны помочь сделать их более понятными и удобными для пользователя.
Прежде чем задавать вопросы о Stackoverflow, рекомендуется прочитать соответствующую документацию.
Примеры из документации Armadillo:
Для функций R = chol(X)
и chol(R, X)
: если декомпозиция не удалась, R сбрасывается, и chol(X)
генерирует исключение std::runtime_error, а chol(R,X)
возвращает bool со значением false< /эм>.
Для функций eig_sym(X)
и inv(X)
: если X не квадратный, создается исключение std::logic_error.
Для таких операторов, как +
, возникает исключение std::logic_error, если используются несовместимые размеры объектов.
При доступе к элементу, например A(i,j)
, возникает исключение std::logic_error, если запрошенный элемент выходит за границы.
и т.д.
Исходный код Armadillo также доступен, так что вы можете напрямую посмотреть на него и посмотреть, что он делает.
std::logic_error
, как указано в документации. - person prajmus   schedule 25.06.2014