ROS_INFO_STREAM 不打印
ROS_INFO_STREAM does not print
我正在尝试在叠瓦式 try...catch 中使用 ROS_INFO_STREAM,但我只有顶级输出
这是一小段代码:
void failure()
{
try
{
// throw std::length_error
std::string("abc").substr(10);
}
catch (...)
{
ROS_ERROR_STREAM("ROS failure()"); // print OK
std::cout << "cout failure()" << std::endl; // print OK
throw; // re-throw the exception
}
}
int main()
{
try
{
ROS_ERROR_STREAM("ROS calling"); // print OK
failure(); // will throw
}
catch (...)
{
ROS_ERROR_STREAM("ROS call function"); // <-- NO print
std::cout << "cout call function" << std::endl; // print OK
}
return 0;
}
输出:
ROS calling
ROS failure()
cout failure()
cout call function
我的猜测是 ROS_ERROR_STREAM 看起来缓冲了,但作为错误输出它不应该。
我是 运行 ROS Groovy
当 ros::shutdown()
在 ROS 节点某处被调用时,rosconsole 中的所有宏停止工作。
我可以想象你会发生这样的事情:在自动调用 ros::shutdown()
函数的错误之后,可能会到达 main 中的 catch 块。
如果您想保持与 ROS 宏提供的格式相同的输出格式,您可以使用像这样的简单代码,但忘记用颜色或其他东西突出显示代码:
std::cout << "[ INFO] [" << ros::Time::now() << "]: main catch" << std::endl;
要使 ROS_*
日志语句起作用,您必须事先显式调用 ros::init(...)
和 ros::start(...)
,或者更常见的是,调用 ros::init 并初始化一个ros::NodeHandle
。后者会为你调用ros::start
。
但是,当最后一个 NodeHandle
超出范围时,它将调用 ros::shutdown()
并且在此之后,您将再次无法使用任何日志记录宏。
我正在尝试在叠瓦式 try...catch 中使用 ROS_INFO_STREAM,但我只有顶级输出
这是一小段代码:
void failure()
{
try
{
// throw std::length_error
std::string("abc").substr(10);
}
catch (...)
{
ROS_ERROR_STREAM("ROS failure()"); // print OK
std::cout << "cout failure()" << std::endl; // print OK
throw; // re-throw the exception
}
}
int main()
{
try
{
ROS_ERROR_STREAM("ROS calling"); // print OK
failure(); // will throw
}
catch (...)
{
ROS_ERROR_STREAM("ROS call function"); // <-- NO print
std::cout << "cout call function" << std::endl; // print OK
}
return 0;
}
输出:
ROS calling
ROS failure()
cout failure()
cout call function
我的猜测是 ROS_ERROR_STREAM 看起来缓冲了,但作为错误输出它不应该。
我是 运行 ROS Groovy
当 ros::shutdown()
在 ROS 节点某处被调用时,rosconsole 中的所有宏停止工作。
我可以想象你会发生这样的事情:在自动调用 ros::shutdown()
函数的错误之后,可能会到达 main 中的 catch 块。
如果您想保持与 ROS 宏提供的格式相同的输出格式,您可以使用像这样的简单代码,但忘记用颜色或其他东西突出显示代码:
std::cout << "[ INFO] [" << ros::Time::now() << "]: main catch" << std::endl;
要使 ROS_*
日志语句起作用,您必须事先显式调用 ros::init(...)
和 ros::start(...)
,或者更常见的是,调用 ros::init 并初始化一个ros::NodeHandle
。后者会为你调用ros::start
。
但是,当最后一个 NodeHandle
超出范围时,它将调用 ros::shutdown()
并且在此之后,您将再次无法使用任何日志记录宏。