【问题标题】:Invalid handle exception无效句柄异常
【发布时间】:2015-08-04 21:12:05
【问题描述】:

我有单元测试来测试我的功能是否不允许使用封闭的套接字。所以它看起来像这样:

closesocket(sock);
int result;
result = getsockopt(sock,SOL_SOCKET,SO_TYPE, type, len);
if(result == SOCKET_ERROR)
    //write error etc.

在 Windows 平台上调用 getsockopt 不会引发异常“0xC0000008:指定了无效句柄。”。在 Windows Phone ARM 平台上,它会引发异常,虽然我可以关闭 First-chance 异常,但我不能真正关闭未捕获的异常。

尝试

try{
getsockopt();
}
catch(...)
{}

不起作用。有没有办法让这个异常静音?

编辑

我想指出我是故意先调用 closesocket(sock) 然后再调用 getsockopt() 因为我想测试我调用 getsockopt() 的函数是否会拒绝这种情况。在 Windows 上,我可以顺利地运行我的测试,因为 getsockopt 不会抛出异常,而在 Windows Phone ARM 上它会,让我坐下来等待这个调用,然后单击继续。

【问题讨论】:

  • 首先,静默异常是一种糟糕的模式。找到问题并解决它。其次,我很确定 Window 的 SEH 或 .NET 异常与 C++ 的 catch(...) 不兼容。

标签: c++ visual-studio


【解决方案1】:

尽管有它们的名字,但它们不是 C++ 异常,而是 SEH exceptions。它们是 Unix 信号的 Windows 等价物。

收到这样的异常类似于段错误 (SIGSEGV):不尝试从中恢复几乎总是更明智的做法,而是首先防止它发生。请参阅getsockopt 的文档了解如何操作。

在“几乎总是”未涵盖的情况下,如果可能,您可以使用编译器特定的__try/__except 结构来捕获和处理 SEH 异常。

【讨论】:

  • 不幸的是 __try/__except 对我不起作用:“不能在需要对象展开的函数中使用 __try”。为什么它不会在 Windows 平台上抛出这些异常?
  • @Michal 预防方法怎么样?您必须向该函数传递一些它不期望的东西。
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多