【发布时间】:2011-03-01 22:25:39
【问题描述】:
嘿,我想知道如何处理特定的错误代码。例如[Errno 111] Connection refused
我想在套接字模块中捕捉到这个特定的错误并打印一些东西。
【问题讨论】:
标签: python sockets exception exception-handling
嘿,我想知道如何处理特定的错误代码。例如[Errno 111] Connection refused
我想在套接字模块中捕捉到这个特定的错误并打印一些东西。
【问题讨论】:
标签: python sockets exception exception-handling
如果您想获取错误代码,这似乎可以解决问题;
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。
【讨论】:
ECONNREFUSED 似乎是 61 而不是 111,因此硬编码值 111 不利于可移植性。
else: raise 很重要,否则所有其他错误代码将被忽略!
if 配对的else。所以 else 将在第一个缩进级别,在 except 块中。
os.strerror(error.errno) 会将错误代码转换为消息字符串。即:os.strerror(104) 返回 'Connection reset by peer'
至少在 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 的例外情况)。
socket.error 没有 errno 成员。事实证明,在 Python 2.6 之前,socket.error 不是IOError 的子类,因此没有errno 成员。但当然,在 Python 2.6 之前,except t as e 语法也无效......我会更新我的代码。
这似乎很难可靠/便携,但可能是这样的:
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 ***
虽然很恶心。
【讨论】:
errno。
我在 Windows 上进行开发,发现自己处于同样的困境中。但是错误消息总是包含错误号。使用该信息,我只需将异常转换为字符串str(Exception),将我要检查的错误代码转换为字符串str(socket.errno.ERRORX),然后检查错误代码是否在异常中。
连接重置异常示例:
except Exception as errorMessage:
if str(socket.errno.ECONNRESET) in str(errorMessage):
print("Connection reset")
#etc...
这避免了特定于区域设置的解决方案,但遗憾的是仍然不是独立于平台的。
【讨论】: