Просто предоставьте контекстную информацию в выделенном исключении.
IntStream.range(0, dataList.size())
.filter(i -> ...)
.mapToObj(i -> {
MyDO myDO = dataList.get(i);
try {
...// some error at i
} catch(Exception ex) {
throw new IllegalStateException("at index "+i, ex);
}
})
.collect(toList());
Вы также можете использовать пользовательский тип исключения, содержащий индекс в качестве значения int
, для упрощения обработки (в случае, если вы хотите сделать больше, чем просто ведение журнала). Это исключение также может принимать соответствующие MyDO
.
Как правило, здесь может быть проще использовать обычный цикл:
List<MyDO> processedList = new ArrayList<>(dataList.size());
for(int i = 0, num = dataList.size(); i < num; i++) {
if(...) { // your filter criteria
MyDO myDO = dataList.get(i);
try {
...// some error at i
} catch(Exception ex) {
throw new IllegalStateException("at index "+i, ex);
}
processedList.add(myDO);
}
}
или
List<MyDO> processedList = new ArrayList<>(dataList.size());
for(int i = 0, num = dataList.size(); i < num; i++) {
if(...) { // your filter criteria
MyDO myDO = dataList.get(i);
try {
...// some error at i
} catch(Exception ex) {
logger.error("Invalid data found at "+i);
break;
}
processedList.add(myDO);
}
}
чтобы получить эффект вашего примера обработчика исключений.