2010-03-01 4 views
13

J'ai une application écrite en utilisant l'approche M-V-VM.Gestion des exceptions fatales dans ViewModel/Model

L'accès aux données est effectué dans le modèle. Si une erreur fatale se produit ici (par exemple, la connexion à la source de données est perdue) et Exception est levée. Cette exception fait une bulle jusqu'au ViewModel. Toutefois, étant donné que le déclencheur d'origine de l'accès aux données était une liaison de données, WPF avale cette exception (il est uniquement connecté dans la fenêtre de sortie lorsque l'application est exécutée sous le débogueur). Je préférerais que cette exception reste non gérée afin que mon gestionnaire d'exceptions non gérées à l'échelle de l'application puisse la récupérer, la journaliser et quitter avec élégance. Comment puis-je atteindre cet objectif?

+1

Relatif [questions] (http://stackoverflow.com/questions/776193/how-to-propagate-errors-exceptions-that-occur-during-wpf-data-binding) [ici] (http: // stackoverflow.com/questions/978887/why-does-wpf-databinding-swallow-exceptions) ont des réponses qui offrent la meilleure solution à mon humble avis. –

Répondre

8

Vous pouvez mettre en file d'attente une action de lancement d'exception sur le répartiteur.

// This property is connected to the window using databinding 
    public string ExceptionThrowingBoundedField 
    { 
     get 
     { 

      try 
      { 
       // This function might throw an exception 
       return GetValueFromDatabase();    
      } 
      catch (Exception ex) 
      { 
       ApplicationException exWrapper = new ApplicationException("Wrapped Exception", 
                      ex); 
       Action throwException =() => { throw exWrapper; }; 
       Dispatcher.CurrentDispatcher.BeginInvoke(throwException); 
       return ""; 
      } 
     } 
    } 
+2

Cela n'a pas fonctionné pour moi quand mes liaisons ont été déclenchées sur 'LostFocus', jusqu'à ce que je changé (baissais, je présume) la priorité' BeginInvoke': 'Dispatcher.CurrentDispatcher.BeginInvoke (throwException, DispatcherPriority.ContextIdle)'. –

0

il semble comme une question similaire a été posée: link text

+0

Lien utile, mais il se concentre vraiment que sur ces exceptions plus faire évidente dans le débogueur, et ne traite pas la question de retenir les exceptions dans la version construit. –

6

récemment dans a way of getting autour du problème d'exception ingestion d'une manière globale.

Créer une classe personnalisée de liaison et de dérogation UpdateSourceExceptionFilter - voir l'exemple dans ce fil.

Malheureusement, ce n'est que WPF 4.0 et pas SL 4.0.