2010-05-12 10 views
10

Supponiamo che ho un applicazione java legacy con migliaia di righe di codice che fanno:Globalmente Log cattura Exception e

try { 
    // stuff 
} catch (Exception e) { 
    // eat the exception 
} 

C'è qualche opzione globale che ho potuto capovolgere o 3a JAR partito che avrebbe registrare tutti " mangiato "eccezioni? So che potrei fare un enorme rimpiazzo di ricerca (ricerca di catch (Exception e) {e sostituirlo con catch (Exception e) {logException (e);) ma mi chiedevo se ci fosse una soluzione migliore. Grazie!

risposta

7

Si potrebbe forse fornire la propria implementazione di Exception che registra lo stack -traccia nel costruttore. Dalla pagina man di java:

-Xbootclasspath: bootclasspath
Specifica una lista separata da due punti di directory, gli archivi JAR, e archivi ZIP per la ricerca di file di classe di avvio. Questi sono utilizzati al posto dei file di classe di avvio inclusi nell'SDK Java 2 .

+0

+1 è un'idea interessante. – Finbarr

+0

Mi piace. È subdolo e potrebbe funzionare. –

+0

Probabilmente non per i deboli di cuore. – Raedwald

0

No. Se il codice rileva l'eccezione e non fa nulla, non c'è nulla che tu possa fare per modificarlo senza modificare il codice.

Un find-replace dovrebbe funzionare. Tuttavia, raccomanderei anche di controllarlo con FindBugs in seguito per assicurarmi di aver trovato tutte le istanze di questo problema. (FindBugs dovrebbe comunque far parte del processo, ma lo faccio solo nel caso in cui qualcuno lo leggesse non lo usi già.)

+0

La programmazione orientata agli aspetti consente di registrare le eccezioni senza modificare il codice originale, come ha notato Rob Di Marco nella sua risposta (http://stackoverflow.com/questions/2820259/globally-log-catch-exception-e/2820381# 2.820.381). – markusk

+0

@markusk: punto preso; ci sono in realtà diversi modi per farlo. Ho lasciato questa risposta principalmente per la parte di FindBugs. –

+0

In tal caso, perché non eliminare il primo paragrafo della risposta? Il tuo consiglio su FindBugs è ancora utile. – markusk

0

Questo vi permetterà di gestire tutte le eccezioni non gestite fanno:

Thread.setDefaultUncaughtExceptionHandler(
    new Thread.UncaughtExceptionHandler(){ 
    public void uncaughtException(Thread t, Throwable e) { 
     //handle the exception 
    } 
}); 
+0

Ma non è quello che chiede. – aioobe

+1

Buona risposta alla domanda sbagliata. Le eccezioni di cui si occupa l'OP sono prese, non scoperte –

5

sembra un posto in cui Aspect Oriented Programming potrebbe rivelarsi utile. È possibile impostare un collegamento per il gestore delle eccezioni. Controlla AspectJ per una bella implementazione AOP.

+0

Idea interessante ... – JoeGeeky