2012-01-10 3 views
7

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

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?

+3

Ловля и просто сбрасывание исключения из stdout - это, как правило, плохая идея. Вместо этого либо * не * улавливайте исключение (оставляя его для вызова кода), либо обрабатывая его соответствующим образом. Нет никакой реальной абстракции, доступной для «обрабатывать ее по мере необходимости», поскольку она варьируется в зависимости от содержимого «bla». –

+0

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

+0

Ловля общего «Исключения» обычно является плохой идеей, если вы не пишете фреймворк код какого-то типа. –

ответ

4

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

public void bar() throws Exception {} 

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

+1

Я бы дал это +1 *, если * он не выбрасывал «Исключение», а скорее более конкретные типы исключений. Я понимаю, что вопрос OP касался «Исключения», но я не думаю, что мы должны его поощрять. Подумайте о бедном человеке, который должен кодировать этот интерфейс. S/он должен теперь поймать и справиться с общим «Исключением». –

+0

Для справки я вообще не согласен с этим; Я предпочитаю также определенные типы «Исключение», если они должны быть объявлены для того, чтобы быть выброшенными. Все наши исключения - это «RuntimeException», поэтому нет необходимости объявлять (но они должны быть задокументированы для API!) – sarumont

+0

Ну, объявление частных методов как 'throws Exception', хотя и не очень элегантное, не кажется плохим мне. – gpeche

1

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

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

2

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

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

1

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

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

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

Ради этого ответа, что

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

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

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

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

Смежные вопросы