【问题标题】:Python handling specific error codes?Python 处理特定的错误代码?
【发布时间】:2011-03-01 22:25:39
【问题描述】:

嘿,我想知道如何处理特定的错误代码。例如[Errno 111] Connection refused

我想在套接字模块中捕捉到这个特定的错误并打印一些东西。

【问题讨论】:

    标签: python sockets exception exception-handling


    【解决方案1】:

    如果您想获取错误代码,这似乎可以解决问题;

    import errno
    
    try:
        socket_connection()
    except socket.error as error:
        if error.errno == errno.ECONNREFUSED:
            print(os.strerror(error.errno))
        else:
            raise
    

    您可以查找errno error codes

    【讨论】:

    • 在 OSX 上,ECONNREFUSED 似乎是 61 而不是 111,因此硬编码值 111 不利于可移植性。
    • 你是绝对正确的。我相信还有更多这样的案例。
    • 拥有else: raise 很重要,否则所有其他错误代码将被忽略!
    • @AnatolyAlekseev 我的意思是与if 配对的else。所以 else 将在第一个缩进级别, except 块中。
    • os.strerror(error.errno) 会将错误代码转换为消息字符串。即:os.strerror(104) 返回 'Connection reset by peer'
    【解决方案2】:

    至少在 Unix 平台上,您可以执行以下操作。

    import socket, errno
    try:
        # Do something...
    except socket.error as e:
        if e.errno == errno.ECONNREFUSED:
            # Handle the exception...
        else:
            raise
    

    在 Python 2.6 之前,使用 e.args[ 0 ] 而不是 e.errno

    【讨论】:

    • 使用e.errno 而不是e.args[0] 通常是首选(对于使用errnos 的例外情况)。
    • 我一开始以为是这样,但在我的 Mac 上测试它似乎 socket.error 没有 errno 成员。事实证明,在 Python 2.6 之前,socket.error 不是IOError 的子类,因此没有errno 成员。但当然,在 Python 2.6 之前,except t as e 语法也无效......我会更新我的代码。
    【解决方案3】:

    这似乎很难可靠/便携,但可能是这样的:

    import socket
    
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('localhost', 4167))
    except socket.error, e:
        if 'Connection refused' in e:
            print '*** Connection refused ***'
    

    产生:

    $ python socketexception.py 
    *** Connection refused ***
    

    虽然很恶心。

    【讨论】:

    • 你为什么说这是不可靠的/不可移植的?这有什么“恶心”的?
    • 因为我不能 100% 确定 Windows 上的异常消息中是否包含“连接被拒绝”,而不是类似但不同的内容,例如“无法连接”。不确定这些错误消息是否标准化(例如:在 POSIX 中),而且并非所有平台都必须符合 POSIX。
    • (-1) 警告:这将在非英语语言环境中完全失败。
    • 是的,这很好。这仅适用于英语语言环境。总而言之,这是一个非常糟糕的主意,您应该像上面的答案一样使用errno
    • +1 表示诚实地说“非常恶心,不可移植,依赖于语言环境,糟糕的想法,请不要使用”:-)
    【解决方案4】:

    我在 Windows 上进行开发,发现自己处于同样的困境中。但是错误消息总是包含错误号。使用该信息,我只需将异常转换为字符串str(Exception),将我要检查的错误代码转换为字符串str(socket.errno.ERRORX),然后检查错误代码是否在异常中。

    连接重置异常示例:

    except Exception as errorMessage:
        if str(socket.errno.ECONNRESET) in str(errorMessage):
            print("Connection reset")
            #etc...
    

    这避免了特定于区域设置的解决方案,但遗憾的是仍然不是独立于平台的。

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多