Каков наилучший способ получения прозрачности исключений в 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;
}