Как библиотека Armadillo обрабатывает ошибки?

Только что начал работать с библиотекой Armadillo. В документации и FAQ я не нашел ссылок на то, как Armadillo обрабатывает ошибки. Например, как мне узнать, успешно ли выполнено "mat A(1e10, 1e10)"?


person Jedi    schedule 25.06.2014    source источник
comment
Некоторые функции и конструкторы выдают std::logic_error, как указано в документации.   -  person prajmus    schedule 25.06.2014


Ответы (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: Я полагаю, что менее жесткое отношение к новичкам в конкретной области лучше для здоровья сообщества. Заставлять других читать неполную документацию — неконструктивное мнение. На самом деле, большинство хороших проектов с открытым исходным кодом поставляются с не очень хорошей документацией, поэтому мы должны помочь сделать их более понятными и удобными для пользователя.

person Jedi    schedule 26.06.2014
comment
@mtall: спасибо за комментарий. Это именно та информация, которая отсутствует в официальной документации. Я предлагаю, возможно, вы можете обобщить свой опыт работы с Armadillo и сделать приложение к официальной документации. - person Jedi; 26.06.2014
comment
@mtall: Где вы видели, чтобы я жаловался? Сделать его лучше не означает, что пользователь не может обратиться за помощью. Если мне нужно прочитать все исходные коды, чтобы ответить на мой вопрос о проекте с открытым исходным кодом, я бы предпочел не использовать его. Написать собственный код — гораздо более простая задача. - person Jedi; 26.06.2014

Прежде чем задавать вопросы о 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 также доступен, так что вы можете напрямую посмотреть на него и посмотреть, что он делает.

person mtall    schedule 25.06.2014