Python处理特定的错误代码?
如果你想得到错误代码,这似乎是伎俩;
import errno
try:
socketConnection()
except socket.error, v:
errorcode=v[0]
if errorcode==errno.ECONNREFUSED:
print "Connection Refused"
您可以查阅errno
error codes。
这似乎很难做到可靠/可移植的,但也许是这样的:
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)警告:这会在非英语区域中完全失败。 – sum1stolemyname
在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之前,“除了t as e语法”也是无效的......我会更新我的代码。 – jchl
我在Windows上开发,发现自己陷入了同样的困境。但错误消息始终包含错误号。使用这些信息,我只是将异常转换为字符串str(Exception)
,将我想检查的错误代码转换为字符串str(socket.errno.ERRORX)
并检查错误代码是否在异常中。
例如,用于连接复位异常:
except Exception as errorMessage:
if str(socket.errno.ECONNRESET) in str(errorMessage):
print("Connection reset")
#etc...
这样就避免了区域特定的解决方案,但仍不能独立于平台的不幸。
在OSX上,'ECONNREFUSED'看起来是61而不是111,所以对111值进行硬编码对于可移植性来说是个坏主意。 – jchl
你是对的。我相信有更多这样的案例。 –
有一个'else:raise'很重要,否则所有其他的错误代码将被默默地忽略! – jtpereyda