面试题答案
一键面试1. 自定义异常类的继承结构
首先,定义一个基础的自定义异常类,所有其他与网络业务逻辑相关的异常都继承自它。
public class NetworkBusinessException extends Exception {
public NetworkBusinessException(String message) {
super(message);
}
}
然后,根据不同类型的网络业务逻辑错误,定义具体的异常类。例如:
public class NetworkConnectionException extends NetworkBusinessException {
public NetworkConnectionException(String message) {
super(message);
}
}
public class NetworkDataFormatException extends NetworkBusinessException {
public NetworkDataFormatException(String message) {
super(message);
}
}
2. 异常抛出的时机
- 网络连接异常:在尝试建立网络连接失败时抛出
NetworkConnectionException
。例如,在使用Socket
类进行连接时,如果connect
方法失败:
try {
Socket socket = new Socket("example.com", 80);
} catch (IOException e) {
throw new NetworkConnectionException("Failed to connect to server", e);
}
- 网络数据格式异常:当从网络接收的数据不符合预期格式时抛出
NetworkDataFormatException
。比如,在解析接收到的JSON数据时:
ObjectMapper mapper = new ObjectMapper();
try {
MyDataObject obj = mapper.readValue(jsonString, MyDataObject.class);
} catch (JsonProcessingException e) {
throw new NetworkDataFormatException("Invalid data format received from network", e);
}
3. 在不同层次的代码中捕获和处理这些自定义异常
- 业务逻辑层:在业务逻辑层捕获异常,进行初步处理,例如记录日志,并决定是否将异常继续向上抛出。
public class NetworkService {
public void performNetworkOperation() {
try {
// 执行网络操作,可能抛出 NetworkBusinessException
} catch (NetworkConnectionException e) {
// 记录连接异常日志
System.err.println("Network connection error: " + e.getMessage());
// 可以选择在这里进行重试逻辑
// 或者向上抛出异常给调用者处理
throw new RuntimeException(e);
} catch (NetworkDataFormatException e) {
// 记录数据格式异常日志
System.err.println("Network data format error: " + e.getMessage());
// 可以尝试修复数据格式或者向上抛出异常
throw new RuntimeException(e);
}
}
}
- 控制器层(如果存在MVC架构):在控制器层捕获异常,将异常信息转换为合适的响应返回给客户端,确保客户端能得到清晰的错误提示。
@RestController
public class NetworkController {
private final NetworkService networkService;
public NetworkController(NetworkService networkService) {
this.networkService = networkService;
}
@GetMapping("/network-operation")
public ResponseEntity<String> performNetworkOperation() {
try {
networkService.performNetworkOperation();
return ResponseEntity.ok("Network operation successful");
} catch (RuntimeException e) {
if (e.getCause() instanceof NetworkBusinessException) {
NetworkBusinessException networkException = (NetworkBusinessException) e.getCause();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Network business error: " + networkException.getMessage());
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Unexpected error");
}
}
}
通过这种方式,我们可以构建一个清晰、可维护的自定义异常处理体系,确保系统在面对网络业务逻辑错误时具有较好的稳定性和可维护性。