У меня есть метод. У этого метода есть блок перехвата.
// 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, реализованный в классе. Есть ли способ сделать это или мне стоит подумать о другом подходе?
Подождите ..._ какой_ блок catch вы хотите выполнить?
второй. Где метод называется
бросить что-нибудь в первую
Каким программированием вы занимаетесь? Ожидаете выполнить код в блоке catch?
Часто блок catch выдает ошибку, специфичную для этого метода; вы можете поймать и справиться с этим. Но нет, вы не можете пропускать поймать блок. Например, лучше всего было бы переписать вашу логику с помощью конкретной тестовой функции ... если, конечно, функция с уловкой не является частью сторонней библиотеки.
Используйте весь блок catch в вызывающей функции.
Я выбрал другой подход. Спасибо всем за ваши мысли и объяснения. Мне было любопытно, есть ли способ сделать это.




Обходной путь - переместить вашу логику в другой метод, который не обрабатывает это исключение, а просто передает его вверх, например:
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 :)
Подумайте о другом подходе, потому что это невозможно