我们正在使用MVVMCross框架开发跨平台应用程序,包括iOS,Android和WP7。我发现在MvxApplication中没有一个我可以覆盖的方法,可以作为平台中立的未处理异常处理程序(由特定于平台的方法调用)。
因此,问题是,在MVVMCross应用程序中一般情况下以及在异步调用期间如何处理异常?
谢谢, Attila
因此,问题是,在MVVMCross应用程序中一般情况下以及在异步调用期间如何处理异常?
谢谢, Attila
对于真正意外的异常(崩溃!),目前尚未有答案:请参见MonoTouch和MonoDroid中的崩溃报告。
然而,如果您想了解如何在异步调用期间处理异常的建议,请参考BestSellers示例:MvvmCross BestSellers Sample
BestSellers使用了我在MvvmCross应用程序中经常使用的2种技术:
更详细地说,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中添加此功能。