【问题标题】:Identical Error Codes相同的错误代码
【发布时间】:2009-06-07 08:08:26
【问题描述】:

我在 Linux 上使用 python 2.4.1,并在我工作的公司内部编写了一个 python 包,用于在 2 台主机之间建立连接以进行测试。

在建立连接后,定义为客户端的一侧在使用正确的参数调用socket.connect 时失败(我检查了),错误代码为 111。在网上搜索此错误表示后,我了解到这意味着连接被主动拒绝。

但是建立连接的包中的代码应该处理它,只有它知道10061作为同样错误的错误代码:连接被拒绝。

可能相同的逻辑错误有相同的错误代码吗?难道 111 是 Linux 操作系统的系统错误,因为 10061 是 python 甚至是另一个操作系统?即便如此,错误代码的整个概念不就是将逻辑错误与相同的代码统一起来吗?

是否应该简单地将111错误代码添加到处理条件中?

【问题讨论】:

    标签: python error-handling sockets


    【解决方案1】:

    看来 Python 正在从操作系统中暴露错误代码 - 代码的解释取决于操作系统。

    111 在许多 Linux 系统和 Cygwin 上是 ECONNREFUSED

    146 在 Solaris 上是 ECONNREFUSED

    10061 是 winerror.h 中的 WSAECONNREFUSED - 它是 Windows Socket API 的 ECONNREFUSED 版本。

    毫无疑问,在其他系统上,它又是不同的。

    处理此问题的正确方法是使用基于操作系统定义的ECONNREFUSED 的符号比较;例如,这就是您在 C 中执行此操作的方式。换句话说,在特定于平台的库(在任何情况下都需要链接到操作系统的套接字原语)中有一个名为 ECONNREFUSED 的常量,它具有该平台的 ECONNREFUSED 值,并将错误代码与 ECONNREFUSED 常量进行比较,而不是幻数。

    我不知道 Python 处理操作系统错误代码的标准方法是什么。我怀疑这不是经过深思熟虑的。

    【讨论】:

    • 看来python确实有办法通过使用errno包来处理操作系统错误代码。它包含每个标准错误的符号。包括问题中的那个。它至少可以追溯到 2.4.1。
    • 如果我没记错的话,10061 是一个 TCP 错误代码(例如,它也显示在 MVS 上)。因此,如果操作系统选择翻译它,我不确定您是否可以为此“责备”Python。
    • 你去 - 你可能应该修补库以使用那些错误代码符号值(不要添加其他幻数,因为来自不同平台的幻数可能会相互冲突) - 并通知缺陷库的作者。
    • avisser - 10061 确实是 Windows 上 WSAECONNREFUSED 的值(在 winerror.h 中查看),并且就目前使用套接字的绝大多数面向连接的协议而言,它只是 TCP 特定的基于 TCP。
    猜你喜欢
    • 2016-01-21
    • 2021-02-25
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多