Выбрасывание проверенных исключений из анонимных внутренних классов

Каков наилучший способ получения прозрачности исключений в Java при использовании анонимного внутреннего класса для выполнения некоторого кода.

Часто встречающийся в реальном коде шаблон - это использование интерфейса псевдо-Runnable для определения контекста для некоторого заданного кода. Лучший пример, который я могу придумать в JDK, - это java.security.PrivilegedExceptionAction.

try {
    boolean success = AccessController.doPrivileged(
        new PrivilegedExceptionAction<Boolean>() {
            @Override
            public Boolean run() throws Exception {
                // do something
                // read file
                FileInputStream fileInputStream = 
                    new FileInputStream(new File("someFile"));
                return true;
            }
        }
    );
} catch (PrivilegedActionException e) {
    if (e.getCause() instanceof FileNotFoundException) {
        // handle IO exception
    } else {
        // impossible no other checked exception
    }
}

Несмотря на то, что читая код, вы можете ясно видеть, что внутренний код выдает только файл, который не найден, но мы потеряли преимущества проверенных исключений, поскольку вызывающий не знает, какое исключение на самом деле выбрано. Распространенной ошибкой было бы введение кода в анонимный внутренний класс, который вызывал бы новое исключение, и код не заставлял бы вас обрабатывать это исключение.

Мне нужно что-то вроде того, что показано ниже: возможно ли такое поведение без изменения языка?

public interface PrivilegedExceptionAction<T,V... extends Throwable>
{
    public T run() throws V;
}
6
задан GeneSys 28 May 2013 в 09:20
поделиться