Это плохая практика, чтобы поймать Throwable?

Это плохая практика, чтобы поймать Throwable? Например, мой код выглядит примерно так. Но в сонаре он отображается как ошибка. Как мы можем решить эту проблему?

код

try {
            return restTemplate.getForObject(urlSearchID, AccessIDSearchResponse.class);

        } catch (HttpServerErrorException hse) {
            AccesIdExceptionUtility.recoverFromHttpServerExc(hse);
        } catch (HttpClientErrorException hce) {
            AccesIdExceptionUtility.recoverFromHttpClientExc(hce);
        } catch (ClientException ce) {
            AccesIdExceptionUtility.recoverFromClientExc(ce);
        } catch (Exception e) {
            AccesIdExceptionUtility.recoverFromException(e);
        }
        catch (Throwable ex) {
            throw new ServiceException(ErrorMessages.EPO_SYSTEM_ERROR, ex.getMessage(), agentSearchUrl);
        }
        return null;

person Krish    schedule 01.06.2020    source источник
comment
Отвечает ли это на ваш вопрос? Плохо ли ловить Throwable?   -  person akuzminykh    schedule 01.06.2020
comment
Я понимаю эти ответы, не могли бы вы вставить свой ответ здесь   -  person Krish    schedule 01.06.2020


Ответы (2)


Да, как правило, это плохая идея.

Вы перехватываете ошибки, а также исключения . Вы почти наверняка неправильно с ними обращаетесь. Например, вы неправильно обрабатываете ThreadDeath. согласно моему чтению документации. И ваши шансы сделать что-нибудь полезное в VirtualMachineError тонкие ни к чему.

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

person user13463803    schedule 01.06.2020

Да, это плохая практика. В Java Throwable является базовым классом для ошибок и исключений. Вы уже знакомы с исключениями, их можно проверять или не проверять, поэтому вы можете их перехватывать и обрабатывать, регистрировать или повторно вызывать.

Ошибки более сложны, они являются ошибками JVM, такими как OutOfMemoryException, которая является VirtualMachineError. Как вы собираетесь обрабатывать это в своем коде? Ответ: вы просто не можете.

Если вы погуглите «восстановимые и невосстановимые ситуации», исключения будут исправимыми ситуациями, потому что вы можете обрабатывать исключение NullPointerException, а неисправимые ситуации — это ошибки.

Если вы хотите проверить Baeldung, это действительно хороший блог о Java, Spring и т. д. https://www.baeldung.com/java-catch-throwable-bad-practice

person Piotr Solarski    schedule 01.06.2020
comment
Мне просто удалить блок Throwable? - person Krish; 01.06.2020
comment
Да, ты должен. Перехвата исключения должно быть достаточно для обработки других возможностей. - person Piotr Solarski; 01.06.2020