常见异常类型及示例
- 网络异常:
- 示例:消息队列服务器在与客户端建立连接时,可能由于网络不稳定、网络中断等原因导致连接失败。比如使用TCP协议进行通信时,客户端尝试连接服务器,服务器端监听端口正常,但网络中间节点出现故障,导致连接超时。
- Java捕获示例:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class MessageQueueServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("Server is listening on port 12345");
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected: " + clientSocket);
} catch (IOException e) {
System.err.println("Network exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
}
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 12345)
try:
server_socket.bind(server_address)
server_socket.listen(1)
print('Server is listening on port 12345')
client_socket, client_address = server_socket.accept()
print('Client connected:', client_address)
except socket.error as e:
print(f'Network exception occurred: {e}')
- 资源不足异常:
- 示例:当消息队列中消息数量过多,占用大量内存,导致服务器内存不足。比如在基于内存的消息队列实现中,没有合理设置消息队列的最大容量,随着消息不断涌入,最终耗尽服务器内存。
- Java捕获示例:
import java.util.ArrayList;
import java.util.List;
public class MessageQueue {
private List<String> messages = new ArrayList<>();
private static final int MAX_CAPACITY = 10000;
public void addMessage(String message) {
if (messages.size() >= MAX_CAPACITY) {
throw new RuntimeException("Message queue is full, out of resources");
}
try {
messages.add(message);
} catch (OutOfMemoryError e) {
System.err.println("Out of memory exception: " + e.getMessage());
e.printStackTrace();
}
}
}
class MessageQueue:
def __init__(self):
self.messages = []
self.max_capacity = 10000
def add_message(self, message):
if len(self.messages) >= self.max_capacity:
raise Exception('Message queue is full, out of resources')
try:
self.messages.append(message)
except MemoryError:
print('Out of memory exception')
- 数据格式异常:
- 示例:客户端发送到消息队列服务器的消息格式不符合约定。例如,消息队列约定消息应该是JSON格式,而客户端发送了一个格式错误的字符串,如
{"name": "John", age: 30}
(JSON中age字段缺少引号)。
- Java捕获示例:
import com.google.gson.JsonSyntaxException;
import com.google.gson.Gson;
public class MessageProcessor {
public void processMessage(String message) {
Gson gson = new Gson();
try {
Object obj = gson.fromJson(message, Object.class);
System.out.println("Processed message: " + obj);
} catch (JsonSyntaxException e) {
System.err.println("Data format exception: " + e.getMessage());
e.printStackTrace();
}
}
}
import json
class MessageProcessor:
def process_message(self, message):
try:
data = json.loads(message)
print('Processed message:', data)
except json.JSONDecodeError as e:
print(f'Data format exception: {e}')