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.
Merci, c'est quelque chose que je cherchais! –