2012-01-10 10 views
7

Mi chiedo se c'è un modo in java (codice puro, non qualche cosa di Eclipse) in "zucchero sintattico" su ripetitivo tentativo di cattura del codice. Vale a dire, devo avvolgere un sacco di funzionizucchero sintattico try-catch in 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(); 
    } 
} 

e così via. Mi piacerebbe scrivere

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

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

Penso che lo zucchero di questo tipo fosse possibile in python. È possibile in Java?

+3

La cattura e l'eliminazione di un'eccezione allo stdout è in genere una cattiva idea. Invece, * non * cattura l'eccezione (lasciandola al codice chiamante) o gestila come appropriato. Non è disponibile alcuna astrazione reale per "gestirlo come appropriato" in quanto varia a seconda del contenuto di "bla". –

+0

Se non hai intenzione di fare qualcosa di specifico per gestire un'eccezione non rilevata, puoi racchiudere l'intero programma in una singola prova/cattura – Matthew

+0

La cattura di un'eccezione generale di solito è anche una cattiva idea, a meno che tu non stia scrivendo un framework codice di qualche tipo. –

risposta

4

Non si può fare qualcosa come il tuo pseudocodice suggerisce con annotazioni, ma si può fare il metodo (s) buttare:

public void bar() throws Exception {} 

E proprio lasciare che bolla su tutto il senso, la cattura di dove si vuole a, più in alto nell'albero delle chiamate (o giù nello stack delle chiamate, se preferisci).

+1

Darei questo +1 al * se * non lanciava 'Exception', ma piuttosto, tipi più specifici di eccezioni. Mi rendo conto che la domanda dell'OP si è occupata di "Eccezione", ma non penso che dovremmo incoraggiarlo. Pensa al povero ragazzo che deve codificare questa interfaccia. Adesso deve prendere e gestire anche un 'Eccezione' generale. –

+0

Per la cronaca, non sono affatto d'accordo; Preferisco i tipi specifici di 'Exception', anche se devono essere dichiarati per essere lanciati. Tutte le nostre eccezioni sono 'RuntimeException', quindi non c'è bisogno di dichiararle (ma dovrebbero essere documentate per il piacere dell'API !!!) – sarumont

+0

Bene, dichiarare metodi privati ​​come' genera Eccezione', mentre non esattamente elegante, non sembra male per me. – gpeche

1

Per la prima parte della tua domanda, in Java 7 c'è un nuovo zucchero sintattico per rilevare l'eccezione ripetitiva, dai un'occhiata a questo article.

Per la seconda parte della tua domanda, temo che non ci sia nulla di simile in Java.

2

Completa il try/catch in una classe/metodo che accetta un'interfaccia. Passa un'implementazione anonima a quella classe/metodo. Davvero buono solo quando è coinvolta la gestione delle eccezioni, altrimenti altrettanto rumoroso.

Si potrebbe anche giocare ai giochi AOP/bytecode, a seconda del caso d'uso effettivo.

1

Il mio suggerimento è o dichiarare metodi con throws Exception o catturarli e rilanciarli come RuntimeExceptions.

La semplice cattura e stampa di Exceptions è una cattiva idea in pratica perché si sta continuando a eseguire nonostante non si sia fatto nulla per il ripristino dallo Exception. Anche se il codice continua a funzionare bene, presto avrete un file di log pieno di centinaia di eccezioni e diventerà quasi inutile per il debug e la ricerca di informazioni utili in.

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

Per il bene di questa risposta, ho si assumerà che

  1. si è data una base di classe con un sacco di metodi non-finali che generare eccezioni.
  2. si suppone di preparare una classe Estende che estende Base ma modifica il comportamento di alcuni metodi per registrare le eccezioni piuttosto che per lanciarle.
  3. si ha accesso al codice sorgente di Base e si possono apportare modifiche.

È possibile scrivere un processore di annotazione. Metti un'annotazione sulla classe Base che dice al processore di creare la classe Extension. Quindi, su alcuni metodi, inserire un'annotazione che dice al processore di registrare le eccezioni invece di lanciarle.

Questo può essere più lavoro (scrittura e debug del processore) di quanto non risparmia, a seconda delle circostanze.

Potrebbe anche essere possibile ottenere il risultato desiderato scrivendo un InvocationHandler e utilizzando Proxy.

Problemi correlati