【问题标题】:Winsock2 + OpenSSL in C++: How can I catch their exceptions?C++ 中的 Winsock2 + OpenSSL:如何捕获他们的异常?
【发布时间】:2015-05-30 11:24:29
【问题描述】:

我想捕获使用带有 OpenSSL 加密的 Winsock2 的套接字时引发的异常,但我不知道该怎么做。在 C# 中,我只能捕获基类 Exception,但在 C++ 中,试图用“catch(std::exception e)”捕获它们是行不通的。它只适用于“catch(...)”,但我需要一些对象来获取详细信息。

在 C++ 中是否不可能通过为基类 std::exception 创建一个 catch 块来捕获每一种异常,还是我得到了从其他基类派生的异常?

干杯 亚历克斯

【问题讨论】:

    标签: c++ windows sockets exception openssl


    【解决方案1】:

    在 OpenSSL 中,当发生错误时,更详细的信息会存储在“错误队列”中。使用错误队列可以做的最简单的事情是打印整个队列。这可以使用ERR_print_errors_fp() 来打印错误队列。你在使用 C++ 包装器吗?请注意,在大多数情况下,C++ 异常是特定于框架的。有很多例子表明框架异常不是从std::exception 派生的。例如,在 MFC 中,所有异常都源自 CException,与 std::exception 无关。

    【讨论】:

    • 谢谢,当再次出现未知错误时,我会记住这一点。关于包装:我从类对象的方法中调用这些函数并将各种与连接相关的参数保留为成员变量,但我不确定这是否完全符合包装的定义。
    【解决方案2】:

    您甚至可以在 c++ 中将整数作为“异常对象”抛出。所以......没有通用的异常基类。 您将不得不查看您正在使用的库文档,并搜索可能的例外情况。 如果您使用的是 Visual Studio,您可以告诉调试器在抛出异常时停止(主菜单-> 调试-> 异常......或者只是查看您的“输出窗口”并搜索抛出的异常类型)。

    【讨论】:

      【解决方案3】:

      据我所知,winsock 和 OpenSSL 是基于 C 的项目,因此不会抛出 C++ 异常。

      也就是说,这些项目可能引发结构化异常。例如,如果将错误缓冲区传递给这些项目之一导出的函数,操作系统可能会引发访问冲突异常。

      虽然catch such exceptions 可能,但您可能不希望 - 引发异常的应用程序的状态可能不一致。

      【讨论】:

      • 谢谢,当再次出现未知错误时,我会记住这一点。
      猜你喜欢
      • 1970-01-01
      • 2021-05-23
      • 2011-08-25
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多