我使用unistd.h(Linux)中的标准open(),read(), close()函数进行串口访问。
整个事情都包含一个SerialAccessor类,其析构函数想要调用close()。但是,close()没有标记为__THROW,所以lint抱怨没有捕获异常,这在析构函数中是坏事。
问题是:要捕获的正确类型是什么,因为它不是已知的std类之一?
这没有用,这里lint声明“......”没有被捕获:
#include <unistd.h>
try
{
close (fileHandle);
}
catch(...)
{ }
无论如何,我宁愿选择合适的班级/类型,而不是使用“......”。
unistd说:
/* Close the file descriptor FD.
This function is a cancellation point and therefore not marked with
__THROW. */
extern int close (int __fd);
答案 0 :(得分:3)
close()不会抛出C ++异常:成功时返回0,发生错误时返回-1。
如果返回-1,则必须检查errno以了解出错的地方(http://linux.die.net/man/2/close)
答案 1 :(得分:3)
当close()
被标记为取消点时,当您运行多线程程序并调用close()
时,另一个线程可以获得控制并取消您的线程。
这意味着您的线程无法再继续运行,但运行时系统可能需要进行某种清理。在一些 O / S上,这是通过系统调用抛出一个你不应该捕获的异常来实现的(这也意味着你应该非常小心地编写catch (...)
,因为它可以捕获一些奇怪的事情。)
啊:找到我想要的那个:运行时抛出abi::__forced_unwind
异常,你必须重新抛出它,有点像这样:
try
{
close (fileHandle);
}
catch (abi::__forced_unwind const &)
{
throw;
}
catch(...)
{ }
答案 2 :(得分:0)
答案 3 :(得分:0)
关闭该线的lint警告; close
不会抛出。