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

时间:2012-05-02 09:49:10

标签: windows-phone-7 xamarin.ios xamarin.android mvvmcross

我们正在使用MVVMCross框架为iOS,Android和WP7开发一个跨平台应用程序,我在MvxApplication中缺少一个我可以覆盖的方法,它可以作为平台中立的未处理异常处理程序(由平台特定的)。

所以问题是在MVVMCross应用程序的异步调用期间,一般处理异常的建议方法是什么?

谢谢, 阿提拉

1 个答案:

答案 0 :(得分:3)

对于真正意想不到的异常(崩溃!),此问题目前尚未得到解答:请参阅crash reporting in MonoTouch and MonoDroid


但是,有关如何在异步调用期间处理异常的建议,请查看BestSellers示例:MvvmCross BestSellers Sample

BestSellers使用了2种技术,我发现我在MvvmCross应用程序中使用了很多技术:

  • 将BaseViewModel类用于共享ViewModel代码,如错误处理
  • 使用应用程序级别“错误路由器”从ViewModel获取错误,如UIAlertViews,Toasts和/或MessageBoxes等UI通知。

在更详细的层面上,BestSellers所做的是:

每个ViewModel都使用对Web服务的直接调用来获取图书信息。例如,Category List构造为:

    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构建期间,此注入对象初始化为单身 - 请参阅App.cs中的ErrorApplicationObject

在构建和设置过程中,UI项目都会订阅来自同一单例的事件 - 但使用IErrorSource界面或IErrorReporter

然后允许每个平台显示它自己的错误显示 - 例如:


显然,如果您需要错误处理以及错误显示 - 例如如果要重试异步操作或者想要加载数据的脱机副本 - 那么可以将其添加到ViewModel和BaseViewModel中的错误处理中。