close()抛出什么异常类型?

时间:2014-05-30 08:57:15

标签: c++ exception try-catch

我使用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);

4 个答案:

答案 0 :(得分:3)

close()不会抛出C ++异常:成功时返回0,发生错误时返回-1。

如果返回-1,则必须检查errno以了解出错的地方(http://linux.die.net/man/2/close

答案 1 :(得分:3)

close()被标记为取消点时,当您运行多线程程序并调用close()时,另一个线程可以获得控制并取消您的线程。

这意味着您的线程无法再继续运行,但运行时系统可能需要进行某种清理。在一些 O / S上,这是通过系统调用抛出一个你不应该捕获的异常来实现的(这也意味着你应该非常小心地编写catch (...),因为它可以捕获一些奇怪的事情。)

另见this question

的答案

啊:找到我想要的那个:运行时抛出abi::__forced_unwind异常,你必须重新抛出它,有点像这样:

try
{
    close (fileHandle);
}
catch (abi::__forced_unwind const &)
{
     throw;
}
catch(...)
{ }

答案 2 :(得分:0)

  1. EBADF - 提供的参数不是有效的文件描述符
  2. EINTR - 函数调用被信号中断
  3. EIO - 发生I / O错误

答案 3 :(得分:0)

关闭该线的lint警告; close不会抛出。