2012-05-02 5 views
3

Nous développons une application multiplateforme pour iOS, Android et WP7 en utilisant le framework MVVMCross et il me manque une méthode dans MvxApplication que je peux remplacer et qui peut servir de gestionnaire d'exception non gérée plate-forme (qui est appelée par la plateforme spécifiques).Quelle est la méthode suggérée pour gérer les exceptions dans une application MVVMCross?

La question est donc de savoir quelle est la méthode suggérée pour gérer les exceptions en général et pendant un appel asynchrone dans une application MVVMCross? (! accidents)

Merci, Attila

Répondre

3

Pour des exceptions véritablement inattendues alors cette question est actuellement sans réponse: voir crash reporting in MonoTouch and MonoDroid


Cependant, pour une suggestion sur la façon dont vous pouvez gérer les exceptions au cours d'une async appelez, puis jetez un coup d'œil à l'exemple BestSellers: MvvmCross BestSellers Sample

BestSellers utilise 2 techniques que j'ai trouvées beaucoup utilisées dans les applications MvvmCross:

  • l'utilisation des classes BaseViewModel pour le code ViewModel partagé comme la gestion des erreurs
  • l'utilisation d'un « routeur d'erreur » niveau d'application pour obtenir des erreurs des ViewModels aux notifications UI comme UIAlertViews, Toasts et/ou MessageBoxes.

A un niveau plus détaillé, ce BestSellers fait est:

Chaque ViewModel utilise un appel direct à un webservice pour l'information comptable. Par exemple, le Category List est construit comme suit:

public CategoryListViewModel() 
    { 
     AsyncLoad(); 
    } 

    private void AsyncLoad() 
    { 
     GeneralAsyncLoad(URL_CATEGORIES, ProcessResult); 
    } 

où GeneralAsyncLoad est définie dans une commune BaseViewModel:

protected void GeneralAsyncLoad(string url, Action<Stream> responseStreamHandler) 
    { 
     try 
     { 
      IsLoading = true; 
      var request = WebRequest.Create(url); 
      request.BeginGetResponse((result) => GeneralProcessResponse(request, result, responseStreamHandler), null); 
     } 
     catch (ThreadAbortException) 
     { 
      throw; 
     } 
     // obviously we could do better than catching all `Exception` here! 
     catch (Exception exception) 
     { 
      IsLoading = false; 
      ReportError("Sorry - problem seen " + exception.Message); 
     } 
    } 

La méthode de ReportError dans le gestionnaire d'exception ci-dessus utilise un objet injecté - un IErrorReporter.

Cet objet injecté est initialisés comme un singleton lors de la construction App - voir ErrorApplicationObject dans App.cs

Au cours de leur construction et l'installation, les projets de l'interface utilisateur tous les abonner à des événements de ce même singleton - mais en utilisant une interface IErrorSource à la place ou IErrorReporter .

Cela permet ensuite à chaque plate-forme d'afficher son propre affichage d'erreur - par ex.:


De toute évidence, si vous avez besoin d'erreur manipulation ainsi que l'affichage d'erreur - par exemple Si vous voulez réessayer l'opération asynchrone ou si vous voulez charger une copie hors ligne de données à la place - alors vous pouvez l'ajouter à votre gestion des erreurs dans le ViewModel et le BaseViewModel.

+0

Merci, c'est quelque chose que je cherchais! –

Questions connexes