Функция catch (Exception e) перехватывает любое исключение типа Exception.class или подкласс из Exception, которое выдается в блоке try. Таким образом, исключение вы бросаете себе в блок try. Если ResponseError является подклассом Exception, то он также будет перехвачен.
Вы можете выбросить ResponseError вне попытки. Если вы определите voidResult до того, как попытаетесь выполнить проверку errorGenerated после, у вас больше не возникнет этой проблемы. Вы получаете что-то вроде этого:
VoidResult voidResult = null;
try {
// some code getting to a voidResult
} catch (Exception e) {
// some code dealing with this eception
}
if (voidResult != null && voidResult.errorGenerated()) {
// throw ResponseError
}
Или вы должны убедиться, что catch (Exception e) охватывает не все исключения, а только более конкретные. Это зависит от кода реализации, если это варианты. Скажем, если ваш код реализации только выбрасывает ConnectionExceptions (чтобы назвать пример), вы можете поймать (ConnectionException) вместо Exception. Если ResponseError является подклассом Exception, но не является подклассом ConnectionException, он больше не будет перехвачен.
Вы также можете сделать что-то вроде:
DefaultResponse errorResponse = null
try {
// some code
if (voidResult.errorGenerated()) {
errorResponse = new DefaultResponse();
}
} catch (Exception e) {
// deal with error
}
if (errorResponse != null) {
throw new ResponseError////
Как и в прошлый раз, вы можете попытаться увидеть, является ли Исключение, которое вы поймали, вашим собственным Исключением, и отбросить его.
catch (Exception e) {
if (e instanceof ResponseError && ((ResponseError) e).getCode.equals(myCode)) {
throw e;
else { // etc.