在MVVMCross应用程序中处理异常的建议方法是什么?

3
我们正在使用MVVMCross框架开发跨平台应用程序,包括iOS,Android和WP7。我发现在MvxApplication中没有一个我可以覆盖的方法,可以作为平台中立的未处理异常处理程序(由特定于平台的方法调用)。
因此,问题是,在MVVMCross应用程序中一般情况下以及在异步调用期间如何处理异常?
谢谢, Attila
1个回答

3

对于真正意外的异常(崩溃!),目前尚未有答案:请参见MonoTouch和MonoDroid中的崩溃报告


然而,如果您想了解如何在异步调用期间处理异常的建议,请参考BestSellers示例:MvvmCross BestSellers Sample

BestSellers使用了我在MvvmCross应用程序中经常使用的2种技术:

  • 使用BaseViewModel类来共享ViewModel代码,例如错误处理
  • 使用应用程序级别的“错误路由器”将错误从ViewModel传递到UI通知,例如UIAlertViews、Toasts和/或MessageBoxes。

更详细地说,BestSellers 的作用是:

每个 ViewModel 都使用直接调用 Web 服务获取书籍信息。例如,类别列表 构建如下:

    public CategoryListViewModel()
    {
        AsyncLoad();
    }

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

GeneralAsyncLoad在共享的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);
        }
    }

上述异常处理程序中的ReportError方法使用了一个注入对象 - 一个IErrorReporter

这个注入对象在应用程序构建期间被初始化为单例 - 参见App.cs中的ErrorApplicationObject

在UI项目的构建和设置过程中,所有项目都订阅来自同一单例的事件 - 但是使用IErrorSource接口而不是IErrorReporter

这样就允许每个平台显示自己的错误显示 - 例如:


显然,如果您需要错误处理以及错误显示 - 例如,如果您想重试异步操作或者想加载离线数据副本 - 那么您可以在ViewModel和BaseViewModel中添加此功能。


谢谢,这正是我在寻找的东西! - Attila Hajdrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接