2

我正在编写一个可能会被其他人使用的 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;
}

这是处理这种情况的好方法还是坏方法?提前致谢

4

2 回答 2

4

您正在捕获所有 std::exceptions。我认为你应该只捕获boost::system::system_error异常。

否则,您可能会打印误导性错误报告(即,在分配失败的情况下,您也会捕获std::bad_alloc)。

于 2013-10-24T12:20:48.090 回答
2

这是处理这种情况的好方法还是坏方法?

只有您可以知道,因为只有您知道您的应用程序做什么以及它的流程是什么。

一些准则(可能不适用于您的情况):

  1. 捕获处理您的案例的最专业的异常(如@Johny 提到的, try boost::system::system_error)。

  2. 如果您在捕获异常时打印一条消息,请同时打印 e.what()。可能是,在某些情况下,您会boost::system::system_error因为与读取权限相关的原因不同的原因(即 /dev/ttyUSB0 根本不存在?)。如果您不打印e.what(),您最终会丢失实际的错误原因并将其错误地识别为权限问题。

  3. 还打印 e.code() (如果您正在使用boost::system::system_error)。这将为您提供实际的(系统级)错误代码,更准确地识别错误原因。

  4. 如果您可以从此错误中恢复,请不要throw;进一步。terminate()如果您这样做,您的应用程序将不会。

于 2013-10-24T12:43:15.713 回答