Подтвердить что ты не робот

Можно ли поймать все исключения, кроме исключений во время выполнения?

У меня есть инструкция, которая выдает множество проверенных исключений. Я могу добавить все блоки catch для всех из них следующим образом:

try {
    methodThrowingALotOfDifferentExceptions();
} catch(IOException ex) {
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
} catch(ClassCastException ex) {
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
} catch...

Мне это не нравится, потому что все они обрабатываются одинаково, так что есть дубликат кода, а также много кода для записи. Вместо этого можно поймать Exception:

try {
    methodThrowingALotOfDifferentExceptions();
} catch(Exception ex) {
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
}

Это было бы нормально, за исключением того, что я хочу, чтобы все исключения во время выполнения удалялись, не будучи пойманными. Есть ли какие-либо решения? Я думал, что какое-то умное обобщенное объявление о типе исключаемого исключения может сделать трюк (или, может быть, нет).

4b9b3361

Ответ 1

Вы можете сделать следующее:

try {
    methodThrowingALotOfDifferentExceptions();
} catch(RuntimeException ex) {
    throw ex;
} catch(Exception ex) {
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
}

Ответ 2

Если вы можете использовать Java 7, вы можете использовать Multi-Catch:

try {
  methodThrowingALotOfDifferentExceptions();
} catch(IOException|ClassCastException|... ex) {
  throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
}

Ответ 3

Вы можете попробовать что-то вроде этого, чтобы в основном поймать все, а затем повторно выбросить RuntimeException, если это экземпляр этого класса...

try {
    methodThrowingALotOfDifferentExceptions();
} catch(Exception ex) {
    if (ex instanceof RuntimeException){
        throw ex;
    }
    else {
        throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
    }
}

Увидев, что это будет беспорядочно писать снова и снова (и плохо для ремонтопригодности), я бы, вероятно, переместил код в другой класс, что-то вроде этого...

public class CheckException {
    public static void check(Exception ex, String message) throws Exception{
        if (ex instanceof RuntimeException){
            throw ex;
        }
        else {
            throw new MyCustomInitializationException(message, ex);
        }
    }
}

И используйте его в своем коде, как это...

try {
    methodThrowingALotOfDifferentExceptions();
} catch(Exception ex) {
    CheckException.check(ex,"Class Resolver could not be initialized.");
}

Отмечая, что мы проходим в message, чтобы мы могли настроить наш MyCustomInitializationException.