【发布时间】:2013-10-24 11:47:23
【问题描述】:
我正在编写一个可能会被其他人使用的 ROS 节点,这就是我想要遵循通用准则的原因。有时我想在异常中添加额外的信息,但我不知道该怎么做。这是一个方便的示例:
我的 ROS 节点使用 boost 库连接到串行设备。在 linux 下,例如需要为 /dev/ttyUSB0 设置权限,否则 boost 将无法打开串行连接并终止程序。
这是从控制台复制的原始异常消息:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): open: Permission denied
Aborted (core dumped)
我知道问题可能是什么,我想为用户提供更多信息。这就是为什么我用 try/catch 块换行导致问题的原因:
try{
serial = new boost::asio::serial_port (io, port);
}
catch(const std::exception& e)
{
cerr << "EXCEPTION CAUGHT: Boost::asio::serial_port could not open a connection. Make sure that you have read/write access to the serial port (run: sudo chmod a+rw /dev/ttyUSB0)" << endl;
cerr << endl << "Original exception:" << endl;
throw;
}
这是处理这种情况的好方法还是坏方法?提前致谢
【问题讨论】:
-
只是我的意见,但作为一般经验法则,应尽早处理异常,但不能更早处理。在那个地方打印错误信息可能是个坏主意。例如,考虑有多个串行适配器可用并且您想尝试所有这些的情况。您的函数会打印出误导性信息。相反,在该位置创建自定义类型或添加更多信息(使用例如 Boost.Exception)并稍后打印出错误消息,例如在您的 main() 或您可以从该错误中恢复的地方。
标签: c++ boost exception-handling boost-asio