2011-03-01 142 views

回答

29

如果你想得到错误代码,这似乎是伎俩;

import errno 

try: 
    socketConnection() 
except socket.error, v: 
    errorcode=v[0] 
    if errorcode==errno.ECONNREFUSED: 
     print "Connection Refused" 

您可以查阅errno error codes

+6

在OSX上,'ECONNREFUSED'看起来是61而不是111,所以对111值进行硬编码对于可移植性来说是个坏主意。 – jchl

+0

你是对的。我相信有更多这样的案例。 –

+0

有一个'else:raise'很重要,否则所有其他的错误代码将被默默地忽略! – jtpereyda

-1

这似乎很难做到可靠/可移植的,但也许是这样的:

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 *** 

相当难吃虽然。

+0

为什么你会说这不可靠/不便携?这是什么“猥琐的”? –

+2

因为我不是100%确定在Windows上的异常消息将有“连接被拒绝”,并且不是像“无法连接”那样相似但不同的东西。不确定这些错误消息是否标准化(例如:在POSIX中),并且并非所有平台都必须符合POSIX标准。 –

+0

(-1)警告:这会在非英语区域中完全失败。 – sum1stolemyname

26

在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

+3

通常优先使用'e.errno'而不是'e.args [0]'(对于使用errnos的异常)。 –

+1

我以为这是开始,但在我的Mac上测试它似乎'socket.error'没有'errno'成员。事实证明,在Python 2.6之前,'socket.error'不是'IOError'的子类,所以没有'errno'成员。但是,当然,在Python 2.6之前,“除了t as e语法”也是无效的......我会更新我的代码。 – jchl

0

我在Windows上开发,发现自己陷入了同样的困境。但错误消息始终包含错误号。使用这些信息,我只是将异常转换为字符串str(Exception),将我想检查的错误代码转换为字符串str(socket.errno.ERRORX)并检查错误代码是否在异常中。

例如,用于连接复位异常:

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

这样就避免了区域特定的解决方案,但仍不能独立于平台的不幸。