自定义异常应在读取文件内容后、解析前校验格式合法性时主动抛出;需继承Exception类,于首行/魔数校验、JSON/XML解析异常包装、字段分隔符等处触发,并在Controller层捕获返回400错误。

这不是系统自动抛出的异常(比如 IOException),而是你根据业务规则“人工判定 + 主动抛出”的过程。关键不在“文件读取”本身,而在“读取后对内容的合法性检查”。
怎么定义一个文件格式相关的自定义异常
继承 Exception(编译期异常)或 RuntimeException(运行时异常),推荐前者——因为格式非法属于可预知、应显式处理的业务问题。
- 如果希望调用方必须处理(比如必须提示用户重传),选
Exception - 如果属于内部逻辑错误(比如开发时约定必须是 JSON 却传了 XML),也可用
RuntimeException
示例:
public class InvalidFileFormatException extends Exception {
public InvalidFileFormatException(String message) {
super(message);
}
public InvalidFileFormatException(String message, Throwable cause) {
super(message, cause);
}
}
在哪一步触发它:校验时机决定成败
触发点不是打开文件时,而是读取内容后、开始解析前。常见位置包括:
- 读取文件首行或魔数(如 CSV 文件开头不是逗号分隔,JSON 文件不以
{或[开头) - 解析 JSON/XML 时捕获底层异常(如
JsonParseException),再包装成你的业务异常 - 校验字段数量、分隔符一致性、编码格式(如期望 UTF-8 却读到乱码字节)
示例(校验 JSON 格式):
public void parseConfigFile(File file) throws InvalidFileFormatException {
String content = readFileContent(file); // 自行实现,可能抛 IOException
if (!content.trim().startsWith("{") && !content.trim().startsWith("[")) {
throw new InvalidFileFormatException("文件内容不是合法 JSON 格式: " + file.getName());
}
// 继续用 Jackson/Gson 解析...
}
配合 try-catch 让调用方感知并响应
自定义异常只有被抛出,且上层有对应处理,才能真正起作用。不要只抛不接。
- 在 service 层抛出
InvalidFileFormatException - 在 controller 层用
try-catch捕获,返回友好提示(如 HTTP 400 + 错误消息) - 避免用空 catch 吞掉它,否则等于没写
示例:
try {
configService.parseConfigFile(uploadFile);
} catch (InvalidFileFormatException e) {
return ResponseEntity.badRequest().body("文件格式错误:" + e.getMessage());
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











