Как программно определить успех при вызове функций или методов PCL? - PullRequest
0 голосов
/ 27 апреля 2020

Я начал использовать PCL и несколько раз сталкивался с этим поведением: после настройки объектов фильтра и т. П. Часто существует метод do_it, который обрабатывает весь ввод и получает результат или устанавливает некоторые привести участников. Однако нет никаких указаний на то, была ли операция успешной. Затем я часто вижу используемый макрос PCL_ERROR, который просто выводит информацию об ошибке на какую-то консоль, которую никто никогда не видит.

Есть ли какой-либо унифицированный способ определения успешности выполнения?

Первоначально я подозревал, что макрос PCL_ERROR расширится до консольной печати для сборки интерактивного консольного приложения PCL и до исключения для сборки библиотеки. Но нет, он всегда просто печатает.

Теперь я обращаюсь к реализации соответствующего метода и выясняю, инициализируются ли и как выходные данные инициализируются и устанавливаются после того, как больше нет доступных макросов PCL_ERROR. Таким образом, я могу проверить вывод для этого. Это утомительно и совершенно непереносимо. Как пользователь API, он должен быть скрыт от меня и прозрачен для меня.

Иногда значение вывода «error» также может быть правильным результатом. Таким образом, каждый проверяет входные данные, если выход подходит, или если это вывод ошибок, в основном переопределяя семантику углового регистра метода PCL.

Почему бы не использовать исключения или возвращаемые значения?

Пример: pcl \ filters \ median_filter.h

pcl::PointCloud<pcl::PointXYZ>::Ptr in_pc, out_pc;
pcl::MedianFilter<pcl::PointXYZ> filter;

// ...

filter.setInputCloud(in_pc);
filter.applyFilter(*out_pc); // Method has no return value, does validity-check on input, prints error to console if it fails and returns without throwing an exception.

if (out_pc->size() != in_pc->size()) { // It is not documented whether this is intended. I am basically using a side effect of an implementation detail I should not know.
    throw std::domain_error("Could not apply median filter.");
}

Или я просто ошибаюсь?

Приветствия.

...