2012-11-14 8 views
6

È ragionevole mantenere un riferimento a un'eccezione per un uso successivo, o ci sono delle insidie ​​in gioco nel mantenere un riferimento a un'eccezione per un tempo significativamente maggiore rispetto all'interazione throw/catch?Qual è una durata ragionevole aspettarsi da un'eccezione java?

Ad esempio, dato il codice:

class Thing { 
    private MyException lastException = ...; 
    synchronized void doSomethingOrReportProblem() { 
    try { 
     doSomething(); 
    } catch (MyException e) { 
     if (seemsLikeADifferentProblem(e, lastException)) { 
     reportProblem(e); 
     } 
     lastException = e; 
    } 
    } 
} 

Supponendo che il mio programma crea una cosa con una durata di vita fino a quando la JVM, ci sono problemi di correttezza coinvolti Thing mantenendo un riferimento persistente a lastException? E questo è cambiato per niente in JDK7? (Guardando il codice sorgente a Throwable in OpenJDK7, sembra che ci sia un nuovo costruttore pubblico a quattro argomenti che non era in JDK6 che può creare un Throwable senza richiamare fillInStackTrace() al momento della costruzione.)

Se qualcuno di le eccezioni concatenate sotto MyException avevano riferimenti agli oggetti, sì, questo avrebbe impedito a questi oggetti di raccogliere i rifiuti, ma supponendo che io stia bene, ci sono delle trappole da tenere d'occhio?

+0

per rendere il codice completamente indipendente dalle diverse versioni di Java/implementazioni, perché non solo wr si tratta di una classe per memorizzare da sé le informazioni su un errore e aggiornarle ogni volta che si verifica un errore. –

+0

Oltre ai problemi universali con la statica in generale (ad es. Difficoltà di derisione, ecc.)? – CPerkins

+0

das_weezul: si supponga che "seemLikeADifferentProblem" percorra la catena delle eccezioni. Sembra ripetitivo creare una struttura dati per duplicare sostanzialmente l'intera catena. – Mickalot

risposta

0

Un Throwable è un oggetto Java a tutti gli effetti e persisterà finché qualcuno avrà un riferimento. È passato un po 'di tempo da quando ero in Throwable, ma non riesco a pensare a qualcosa che potrebbe a sua volta mantenere un riferimento diverso da (solo forse) le classi dei metodi nello stack trace. Lo stack trace stesso consuma comunque una quantità non trascurabile di storage.

Quindi non è davvero diverso da qualsiasi altro oggetto moderatamente grande. E mantenere un'unica eccezione per la vita della JVM non sembra affatto fuori linea. (Se hai tenuto un record di tutte le eccezioni, che potrebbe essere un po 'troppo.)

0

Suggerirei di trattarlo come un qualsiasi oggetto con "codice nativo/archiviazione sul back-end". Se è necessario mantenere i riferimenti ad alcune eccezioni, ad es. per "ricordare" dove un particolare metodo è stato chiamato da ecc, quindi non aver paura di farlo. D'altra parte, non continuare a centinaia di migliaia di loro senza costruire in qualche modo "il monitoraggio della situazione".

0

Ci sono 2 casi comuni in cui i riferimenti alle eccezioni si svolgono oltre il loro immediato rilevanza programmatico:

  1. Quando viene passato al disboscamento framework
  2. Quando viene propagato al di fuori del contesto del contenitore, in genere di essere tornato a un'applicazione remota dopo essere adattato ad una forma adatta
Problemi correlati