Можно ли поймать все исключения, кроме исключений во время выполнения?
У меня есть инструкция, которая выдает множество проверенных исключений. Я могу добавить все блоки 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);
}
Это было бы нормально, за исключением того, что я хочу, чтобы все исключения во время выполнения удалялись, не будучи пойманными. Есть ли какие-либо решения? Я думал, что какое-то умное обобщенное объявление о типе исключаемого исключения может сделать трюк (или, может быть, нет).
Ответы
Ответ 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
.