Я новичок в интерфейсе функций в Java 8. Этот вопрос связан с Проблема абстрагирования общего кода с использованием интерфейса функций . Исходя из этого я написал так:
public void act(Input1 input) throws NonRetriableException, InvalidInputException {
Function<UpdateTaskInput, Boolean> func = item -> {
try {
activityManager.update(item);
return true;
} catch (InterruptedException | JSONException e) {
throw new NonRetriableException(e);
} catch (LockUnavailableException e) {
throw new NonRetriableException(e);
}
};
try {
lockManager.executeWithLock(input.getTaskID(), input, func);
} catch (LockUnavailableException e) {
log.error("{}",e);
throw new NonRetriableException(e);
}
}
и
public void perform()
throws AutoAllocationException {
Function<UpdateTaskInput, Boolean> func = item -> {
try {
activityManager.allocateTask(item);
return true;
} catch (AutoAllocationException ex) {
log.error("{}",ex);
}
return false;
};
try {
lockManager.executeWithLock(input.getTaskID(), input, func);
} catch (LockUnavailableException e) {
log.error("{}",e);
}
}
executeWithLock () в LockManager выглядит следующим образом:
@Override
public <T,R> R executeWithLock(String lockName, T input, Function<T,R> func) throws LockUnavailableException {
LockItem lockItem = acquireLock(lockName);
R output = func.apply(input);
releaseLock(lockItem);
return output;
}
Теперь мой вопрос:
В функции executeWithLock()
мне нужно захватить все исключения, я имею в виду, должен ли я обрабатывать исключение из func.apply()
. Я хочу знать это, потому что, releaseLock
вызов, который я должен делать, всегда, независимо от того, произошло исключение или нет.