Java Как «переопределить» блок перехвата

У меня есть метод. У этого метода есть блок перехвата.

// pseudo code
private void function() {
    try {
        // something
    } catch(exception e) {
        // error handling
    }
}

Этот метод вызывается в другом классе В одном сценарии класс реализован с собственным блоком перехвата.

// pseudo code
private void anotherFunction() {
    try {
        function(); 
    } catch {
        //another catch block
    }

Теперь я просто хочу выполнить код в блоке catch, в котором вызывается функция, и не вызывать блок catch, реализованный в классе. Есть ли способ сделать это или мне стоит подумать о другом подходе?

Подумайте о другом подходе, потому что это невозможно

Lino 16.07.2018 13:42

Подождите ..._ какой_ блок catch вы хотите выполнить?

Tim Biegeleisen 16.07.2018 13:44

второй. Где метод называется

lynxSven 16.07.2018 13:44

бросить что-нибудь в первую

Kent 16.07.2018 13:45

Каким программированием вы занимаетесь? Ожидаете выполнить код в блоке catch?

azro 16.07.2018 13:45

Часто блок catch выдает ошибку, специфичную для этого метода; вы можете поймать и справиться с этим. Но нет, вы не можете пропускать поймать блок. Например, лучше всего было бы переписать вашу логику с помощью конкретной тестовой функции ... если, конечно, функция с уловкой не является частью сторонней библиотеки.

Maarten Bodewes 16.07.2018 13:46

Используйте весь блок catch в вызывающей функции.

Sumesh TG 16.07.2018 13:58

Я выбрал другой подход. Спасибо всем за ваши мысли и объяснения. Мне было любопытно, есть ли способ сделать это.

lynxSven 16.07.2018 15:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
693
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Обходной путь - переместить вашу логику в другой метод, который не обрабатывает это исключение, а просто передает его вверх, например:

public void unsafeFunction() throws Exception{
    // something
}

А затем вызовите этот метод из обоих классов, где оба обрабатывают исключение по-разному:

public void function(){
    try {
        unsafeFunction();
    } catch(Exception e){
        // error handling
    }
}

А также:

public void anotherFunction(){
    try {
        unsafeFunction();
    } catch(Exception e){
        // other error handling
    }
}

Таким образом, вы оставите то, что должно быть сделано, за исключением вызывающего абонента.


Другой совершенно другой подход - использовать интерфейс java.util.function.Consumer из Java 8 и принять, что в вашем function вызывающий абонент может просто передать ему обработчик ошибок:

public void function(Consumer<? super Exception> errorHandler){
    try{
        // something
    } catch(Exception e){
        // delegate to handler
        errorHandler.accept(e);
    }
}

Что затем можно использовать так:

public void someFunction(){
    function(e -> {
        // error handling
    });
}

А также:

public void anotherFunction(){
    function(e -> {
        // other error handling
    });
}

Вы можете создать исключение для метода вызывающего объекта, используя ключевое слово throw:

private void function(){
    try{
       //something
    } catch(Exception e){
       //error handling
       throw e;
    }
}

Тогда ваш блок перехвата anotherFunction() будет выполнен.

Вы можете узнать больше здесь: Учебники по Java

В вашем первом фрагменте кода:

private void function() {
    try {
        // something
    }
    catch (Exception e) {
        // error handling
        throw e; // rethrow?
    }
}

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

Если ни одно из этих действий не является тем, чего вы действительно хотите, возможно, вам стоит пересмотреть свой дизайн.

Ответ принят как подходящий

Должна быть причина, чтобы поймать исключение. Скажем, эту причину можно проверить отдельным методом:

private boolean testCircumstanceThrowingException() {
    if (exceptionalCircumstance) {
        return false;
    } else {
        return true;
    }
}

тогда вы можете реализовать свою исходную функцию как:

private void functionCatchingException(){
    if (testCircumstanceThrowingException()) {
        //error handling
    }

    function();
}

а также

private void anotherFunction() {
    if (testCircumstanceThrowingException()) {
        //error handling
    }

    function();
}

таким образом, во время нормальной работы приложения исключения не возникают. И так должно быть, потому что исключения для исключительных обстоятельств. Если вы каким-то образом дойдете до состояния, в котором исключения составляют ожидал, то что-то не так.

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


Пуристы в Java заметят, что вы можете просто выполнить return exceptionalCircumstance;, но этот код был предназначен только для того, чтобы показать, что может потребоваться функция, которая проверяет исключительные обстоятельства; результат может даже не быть логическим.

Конечно, теперь вы можете захотеть переименовать functionCatchingException :)

Другие вопросы по теме