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

Potaito

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

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

乌地那汀

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

只有您知道这一点,因为只有您知道您的应用程序的功能和流程。

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

  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()如果您这样做,您的应用程序将不会

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 C++ 中引发异常和处理某些异常类型的正确方法是什么

来自分类Dev

方法C#的异常处理

来自分类Dev

在 MS Visual C++ 中调试未处理异常的正确方法

来自分类Dev

异步方法C#中的异常处理

来自分类Dev

在C#中处理文件时如何正确处理异常

来自分类Dev

在C#中记录冒泡异常的正确方法?

来自分类Dev

异常处理C#

来自分类Dev

C#异常处理与方法结果的返回错误

来自分类Dev

处理readFile和writeFile异常的正确方法

来自分类Dev

捕获的异常无法使用正确的方法处理

来自分类Dev

在Ruby on Rails中处理异常的正确方法

来自分类Dev

删除聚合后处理异常的正确方法

来自分类Dev

在C中处理错误和释放内存的正确方法

来自分类Dev

在C中处理错误和释放内存的正确方法

来自分类Dev

什么是处理歧义类型转换/转换C ++ 11的正确方法

来自分类Dev

C ++ STL streambuf异常处理

来自分类Dev

C ++,处理构造函数的异常

来自分类Dev

GCC C ++异常处理实现

来自分类Dev

C ++中的“未处理的异常”

来自分类Dev

C ++中未处理的异常

来自分类Dev

C ++类包含的异常处理

来自分类Dev

C#中的异常(处理)

来自分类Dev

未处理的异常处理更改了C ++

来自分类Dev

C# Winforms 处理未处理的异常

来自分类Dev

以正确的方式处理异常

来自分类Dev

如何在C#中的yield return方法内正确引发异常

来自分类Dev

C99:处理“ pow()”引发的异常的建议方法是什么(溢出或复数)

来自分类Dev

这是处理管道中的错误/异常的正确方法吗?

来自分类Dev

正确的方法来处理Java中的异常