我知道将异常用于流控制是一种不良做法。但是我遇到了以下情况:我需要解析JSON文件,并且如果记录键的值损坏,我只想记录它并继续解析jsonArray
中的另一个对象。即使该值为null,我也要忽略它并继续。
因此,在当前的实现中,我将try / catch块与continue一起使用。什么是更正确的方法呢?
这是我的实现方式:
public static void parseMetrics(JSONParser parser, File jsonFile,
String metricKey, List<String> metricsList) throws IOException, ParseException {
JSONArray jsonArray = (JSONArray) parser.parse(new InputStreamReader(new FileInputStream(jsonFile)));
for (Object obj : jsonArray) {
try {
JSONObject jsonObject = (JSONObject) obj;
String metricValue = (String) jsonObject.get(metricKey);
Long metricDate = parseDate(jsonObject);
metricsList.add(new Metric(metricValue, metricDate));
} catch (java.text.ParseException e) {
continue;
log.error("Error when parsing JSON", e);
}
}
}
答案 0 :(得分:1)
实际上,您想以error
级别登录解析问题。
所以抛出异常是有道理的。
如果解析错误是异常情况,则应继续使用,但不要使用continue
,在此不方便:
for (Object obj : jsonArray) {
try {
JSONObject jsonObject = (JSONObject) obj;
String metricValue = (String) jsonObject.get(metricKey);
Long metricDate = parseDate(jsonObject);
metricsList.add(new Metric(metricValue, metricDate));
} catch (java.text.ParseException e) {
log.error("Error when parsing JSON", e);
}
}
但是,如果您认为解析问题不是要记录的问题,而是可能发生 的正常情况,则实际上,您不必传播parseDate()
中的异常,但是您可以可能会返回类似OptionalLong
的内容,而不是Long
。
它将从客户端提供:
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
String metricValue = (String) jsonObject.get(metricKey);
OptionalLong metricDate = parseDate(jsonObject);
metricDate.ifPresent(d -> metricsList.add(new Metric(metricValue, d));
}
如果有必要,您也可以在debug
或信息level
中添加日志。