Синтаксический сахар try-catch в java

115
13

Мне интересно, есть ли способ в java (чистый код, а не какая-то вещь Eclipse) для "синтаксического сахара" до повторяющегося кода catch catch. А именно, я должен обернуть кучу функций


public void foo(){
try{
// bla
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}
}

public void bar(){
try{
// other bla
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}
}


и т.д. Я бы хотел написать


@excepted public void foo(){
// bla
}

@excepted public void bar(){
// other bla
}


Я думаю, что сахар этого типа был возможен в питоне. Возможно ли это на Java?

спросил(а) 2012-01-10T22:45:00+04:00 8 лет, 9 месяцев назад
1
Решение
59

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


Во второй части вашего вопроса, боюсь, в Java нет такой вещи.

ответил(а) 2012-01-10T22:50:00+04:00 8 лет, 9 месяцев назад
91

Вы не можете сделать что-то вроде своего псевдокода с аннотациями, но вы можете сделать метод throw:


public void bar() throws Exception {}

И просто дайте ему полностью всплыть, поймав его везде, где захотите, выше дерева вызовов (или, если хотите, вниз по стеку вызовов).

ответил(а) 2012-01-10T22:48:00+04:00 8 лет, 9 месяцев назад
71

Завершите попытку /catch в классе/методе, который принимает интерфейс. Передайте анонимную реализацию этому классу/методу. Действительно полезно только при обработке исключений, иначе аналогично шумно.

Вы также можете играть в игры AOP/bytecode, в зависимости от фактического использования.

ответил(а) 2012-01-10T22:50:00+04:00 8 лет, 9 месяцев назад
58

Мое предложение - либо объявить методы с помощью throws Exception, либо уловить их и изменить их как RuntimeExceptions.


Просто ловить и печатать Exceptions - плохая идея в pratice, потому что вы продолжаете выполнение, несмотря на то, что ничего не сделали для восстановления после Exception. Даже если ваш код продолжает работать нормально, скоро у вас будет файл журнала, заполненный сотнями исключений, и он станет почти бесполезным для отладки и поиска полезной информации.


try {
...
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}

ответил(а) 2012-01-10T22:50:00+04:00 8 лет, 9 месяцев назад
42

Теперь у нас есть синтаксический сахар с именем try-with-resources начиная с JDK 7, поэтому, если вы работаете с ресурсами или можете превратить свой класс в AutoCloseable класс, реализующий AutoCloseable как

public class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Closed MyResource");
}
}

тогда ты освободишься от такого бремени.

Кстати, если вы попытаетесь, как упомянуто @sarumont, просто позволить всплыть исключению, вы можете потерять исходное исключение (исключение в catch будет скрывать исходное исключение из блока try).

ответил(а) 2019-03-28T07:48:00+03:00 1 год, 7 месяцев назад
42

Для этого ответа я предполагаю, что


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

Вы можете написать обработчик аннотации. Поместите аннотацию в класс Base, которая сообщает процессору, что он делает класс Extension. Затем на некоторых методах поставьте аннотацию, сообщающую процессору, чтобы записывать исключения, а не бросать их.


Это может быть больше работы (запись и отладка процессора), чем это экономит, в зависимости от ваших обстоятельств.


Вы также можете достичь желаемого результата, написав InvocationHandler и используя Proxy.

ответил(а) 2012-01-10T23:10:00+04:00 8 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема