Я начал использовать 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.");
}
Или я просто ошибаюсь?
Приветствия.