попробуй поймать синтаксический сахар в Java - PullRequest
7 голосов
/ 10 января 2012

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

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
}

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

Ответы [ 6 ]

4 голосов
/ 10 января 2012

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

public void bar() throws Exception {}

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

2 голосов
/ 10 января 2012

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

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

1 голос
/ 10 января 2012

Я предлагаю либо объявить вам методы с throws Exception, либо перехватить и отбросить их как RuntimeExceptions.

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

try {
   ...
} catch (Exception e) {
   System.out.println("caught exception:");
   e.printStackTrace();
}
1 голос
/ 10 января 2012

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

Для второй части вашего вопроса:Боюсь, в Java такого нет.

0 голосов
/ 28 марта 2019

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

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

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

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

0 голосов
/ 11 января 2012

Ради этого ответа предположу, что

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

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

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

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

...