2011-02-01 15 views
8

Sto cercando un metodo a livello di applicazione per rilevare le eccezioni generate dai getter di proprietà del database (e setter, ma è fattibile senza la stessa difficoltà).WPF Databinding: Eccezioni di cattura generate dai getter di proprietà

Nessuno di questi eventi sarà cattura eccezioni generate dal Getters:

AppDomain.CurrentDomain.UnhandledException 
Application.Current.DispatcherUnhandledException 
Application.Current.Dispatcher.UnhandledException 

Un'altra idea è quella di utilizzare una classe personalizzata vincolante con un UpdateSourceExceptionFilter come descritto in this thread. Sfortunatamente questo metodo cattura solo eccezioni nei setter di proprietà, non nei getter.

L'ultima opzione che ho visto è quello di utilizzare un PresentationTraceSources traccia ascoltatore:

PresentationTraceSources.Refresh(); 
PresentationTraceSources.DataBindingSource.Listeners.Add(new PresentationLoggingTraceListener()); 
PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Error; 

Questo metodo non sembra fare sostanzialmente quello che voglio. Sfortunatamente, mi dà solo una stringa, non un'eccezione, il che significa che dovrei fare un po 'di lavoro di analisi per ottenere l'errore effettivo.

Il metodo TraceListener probabilmente funzionerebbe alla fine, ma sembra un po 'hackerato. Ci sono altre opzioni che mi mancano, o sono abbastanza bloccato con TraceListener?

+2

Mi piacerebbe vedere una risposta per questo –

risposta

1

Suggerirei un approccio Aspect Oriented Programming (AOP) a questo problema. Ti permetterebbe di iniettare codice in fase di compilazione che avvolge il tuo getter con qualunque cosa desideri, in questo caso un try/catch e logging. L'unico con cui ho lavorato è PostSharp Laos, la versione gratuita di PostSharp http://www.sharpcrafters.com.

Credo che questo sia un buon punto di partenza, http://www.richard-banks.org/2009/02/aspect-oriented-programming.html, in questo esempio avvolge setter con la possibilità di chiamare automaticamente NotifyPropertyChanged. Ci sono molti altri progetti AOP che puoi usare ma non li ho usati. Ecco una bella lista: http://www.bodden.de/tools/aop-dot-net. Suggerirei approcci basati sul tessuto.

+0

Grazie per il commento. Penso che questo sia il miglior consiglio che ho visto finora. –

+0

@MartyDill Quindi sei riuscito a convertirlo in una soluzione funzionante? Sarà fantastico se puoi pubblicare la tua esperienza con questo. – akjoshi

Problemi correlati