连接错误(ConnectionError
及其子类)
- 常见类型:
ConnectionRefusedError
:当尝试连接到一个拒绝连接的服务器时会引发,例如服务器未在指定端口监听。
ConnectionAbortedError
:连接被对等方中止时引发,可能因为服务器端突然关闭连接。
ConnectionResetError
:连接被对等方重置时引发,比如服务器端强制关闭连接。
- 处理方式:使用
try - except
语句捕获 ConnectionError
及其子类。
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 9999))
except ConnectionRefusedError:
print("连接被拒绝,可能服务器未启动或端口未监听")
except ConnectionAbortedError:
print("连接被对等方中止")
except ConnectionResetError:
print("连接被对等方重置")
finally:
s.close()
超时错误(TimeoutError
)
- 常见场景:在设置了连接或操作超时时间后,若操作在规定时间内未完成,就会引发此错误。例如在
socket
连接或读取数据时设置了超时。
- 处理方式:同样使用
try - except
捕获 TimeoutError
。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5) # 设置超时时间为5秒
try:
s.connect(('127.0.0.1', 9999))
data = s.recv(1024)
except TimeoutError:
print("操作超时")
finally:
s.close()
地址错误(gaierror
,源于 getaddrinfo
函数错误)
- 常见类型:
- 当主机名无法解析为IP地址时会引发,比如输入了错误的主机名。
- 处理方式:捕获
socket.gaierror
。
import socket
try:
addr_info = socket.getaddrinfo('nonexistenthost.com', 80)
except socket.gaierror as e:
print(f"地址解析错误: {e}")
协议错误(ProtocolError
,特定网络协议相关错误,如HTTP协议中状态码异常等,以http.client
为例)
- 常见场景:在使用HTTP协议时,如果服务器返回的状态码表示错误(如404、500等),可以认为是协议错误。
- 处理方式:在
http.client
模块中,捕获http.client.HTTPException
(ProtocolError
的父类)。
import http.client
try:
conn = http.client.HTTPConnection('example.com')
conn.request('GET', '/nonexistentpage')
res = conn.getresponse()
if res.status >= 400:
raise http.client.HTTPException(f"HTTP错误: {res.status} {res.reason}")
except http.client.HTTPException as e:
print(f"协议错误: {e}")
finally:
conn.close()