Обработка исключений в интерфейсе функций - PullRequest
0 голосов
/ 04 июля 2018

Я новичок в интерфейсе функций в 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 вызов, который я должен делать, всегда, независимо от того, произошло исключение или нет.

1 Ответ

0 голосов
/ 04 июля 2018

Если act выдает исключение, ваш LockItem lockItem не будет выпущен в executeWithLock. Поэтому рекомендуется использовать оператор try-finally при работе с Lock s:

public <T, R> R executeWithLock(String lockName, T input, Function<T, R> func) throws LockUnavailableException {
    LockItem lockItem = acquireLock(lockName);
    try  {
        R output = func.apply(input);
        return output;
    } finally {
        releaseLock(lockItem);
    }
}

Еще один момент:
Поскольку act выбрасывает NonRetriableException в Function, который не объявляет никакого Exception, что подразумевает NonRetriableException extends RuntimeException. Но следующий try-catch-block только перехватывает исключения типа LockUnavailableException. Исключения типа NonRetriableException не будут перехватываться и, следовательно, не обрабатываться (регистрироваться). Они будут переданы вызывающей стороне act, которая executeWithLock. Это еще раз показывает значение первого пункта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...