2011-11-22 16 views
6

A volte si verificano eccezioni. Quando lo fanno, vengono registrati e successivamente analizzati. Il log ovviamente contiene lo stack-trace e altre informazioni globali, ma spesso manca il contesto cruciale. Mi piacerebbe annotare un'eccezione con queste informazioni extra per facilitare il debug post-mortem.Annotazione delle eccezioni con informazioni aggiuntive senza intercettarle

  • Io non voglio try{...}catch{... throw;} dal momento che conta come la cattura un'eccezione e che rende più difficile il debug (durante lo sviluppo mi piacerebbe l'applicazione di fermarsi e il debugger di reagire quando viene generata l'eccezione originale, e non quando l'eccezione non bersagliata più esterna è). I gestori di eccezioni della prima possibilità non sono una soluzione poiché ci sono purtroppo troppi falsi positivi.
  • Vorrei evitare un sovraccarico eccessivo nel caso normale e non eccezionale.

C'è un modo per archiviare parti chiave del contesto (ad esempio il nome del file elaborato o qualsiasi altra cosa) in un'eccezione in un modo che non cattura l'eccezione?

+1

Interessante. Hai pensato di avvolgere il 'try {' e '} catch {... throw;}' in '#if! DEBUG'. In dev avresti ottenuto l'eccezione originale dal sito di chiamata originale. –

+0

Come utilizzare il metodo try {..} catch {.. throw;}, ma modificare le opzioni di Visual Studio da interrompere quando viene generata un'eccezione CLR. – Simon

+2

Sembra una buona misura per AOP come PostSharp, ma questo non soddisfa il tuo requisito di non prenderlo. Rimuove solo la quantità di codice che devi fare. –

risposta

1

Sto facendo un tentativo in questo edificio a partire dal suggerimento di Adam su Aop. la mia soluzione sarebbe l'unità piuttosto che PostSharp e l'unica domanda che avrei è se l'eccezione è essere stato catturato all'interno di invoke, quale probabile è ...

 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     //execute 
     var methodReturn = getNext().Invoke(input, getNext); 

     //things to do after execution 
     if (methodReturn.Exception != null) 
      methodReturn.Exception.Data.Add("filename", "name of file"); 

     return methodReturn; 
    } 
} 
+0

Non mi è del tutto chiaro come sarebbe normale il codice che sfrutta questo aspetto. Quindi se 'A' chiama' B' chiama 'C' e' B' vuole annotare eventuali eccezioni di 'C' con le informazioni - come utilizzeresti? –

1

Non c'è niente di sbagliato con il seguente schema:

try 
{ 
    // Do Something 
} 
catch (GeneralException ex) 
{ 
    throw new SpecificException(
     String.Format("More specifics ({0}) in message", someData), 
     moreContext, 
     new {even, more, context}, 
     ex); 
} 

Questo è precisamente lo schema da utilizzare, ad esempio, quando "Esegui qualcosa" significa, ad esempio, aprire un file di qualche tipo. "SpecificException" potrebbe essere "impossibile leggere il file di configurazione".

+0

Il problema qui è duplice: prima di tutto, in genere è solo confusione, e mi piacerebbe farlo sistematicamente. Le nidificazioni nidificate in nidificato in [...] eccezioni nidificate non [...] aiutano a semplificare un approccio semplice; per non parlare del fatto che in effetti il ​​costo di generare eccezioni può alla fine diventare quadratico con stackdepth in questo modo piuttosto che lineare. In secondo luogo, e più immediatamente fastidioso, ciò causa l'intercettazione dell'eccezione che complica il debug come descritto nella domanda. –

+0

Al secondo però; è molto improbabile che ciò si traduca in una complessità temporale quadratica (sebbene sia necessario conoscere gli interni di CLR per essere sicuri). Tuttavia, ciò risolve i problemi di disordine + di disordine. –

+0

Per inciso, questo è ciò che fondamentalmente faccio ora; funziona, ma sto cercando qualcosa di meglio :-) –

0

Non vorrei utilizzare AOP per rilevare le eccezioni. Invece vorrei usare la classe di intercettazione per LOG l'eccezione + tutti gli argomenti al metodo che ha gettato l'eccezione. E poi lascia che l'eccezione originale venga nuovamente generata

+0

-1: cattiva idea. Se l'eccezione non si propaga, non si acquisisce l'intero stack di chiamate. Registrare l'eccezione nella parte superiore, aggiungendo ulteriori informazioni vicino al sito di chiamata, come richiesto dall'OP. –

+0

Perché è una cattiva idea? Alcuni framework di intercettazione semplicemente 'buttano;' Lo stack di chiamate è prenotato – jgauffin

+0

"riservato" = "conservato" – jgauffin

Problemi correlati