C ++“正确”处理异常的方式

时间:2013-10-24 11:47:23

标签: c++ boost exception-handling boost-asio

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

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

2 个答案:

答案 0 :(得分:4)

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

否则您可能会打印误导性的错误报告(即如果分配失败,您也会发现std::bad_alloc)。

答案 1 :(得分:2)

  

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

只有你才能知道,因为只有你知道你的应用程序做了什么以及它的流程是什么。

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

  1. 抓住处理您案件的最专业的例外情况(正如@Johny所提到的,请尝试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()