MVVMCross フレームワークを使用して iOS、Android、および WP7 用のクロス プラットフォーム アプリケーションを開発していますが、MvxApplication には、プラットフォームに依存しない未処理の例外ハンドラー (プラットフォーム固有のものによって呼び出される) として機能する、オーバーライドできるメソッドがありません。 )。
問題は、MVVMCross アプリケーションで例外を一般的に処理し、非同期呼び出し中に推奨される方法は何ですか?
ありがとう、アッティラ
MVVMCross フレームワークを使用して iOS、Android、および WP7 用のクロス プラットフォーム アプリケーションを開発していますが、MvxApplication には、プラットフォームに依存しない未処理の例外ハンドラー (プラットフォーム固有のものによって呼び出される) として機能する、オーバーライドできるメソッドがありません。 )。
問題は、MVVMCross アプリケーションで例外を一般的に処理し、非同期呼び出し中に推奨される方法は何ですか?
ありがとう、アッティラ
本当に予期しない例外 (クラッシュ!) については、この質問には現在回答がありません: 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 メソッドは、注入されたオブジェクト ( an IErrorReporter
.
この注入されたオブジェクトは、アプリの構築中にシングルトンとして初期化されます - App.csErrorApplicationObject
を参照してください
構築とセットアップの間、UI プロジェクトはすべて、同じシングルトンからのイベントをサブスクライブしますが、IErrorSource
代わりにインターフェースを使用します またはIErrorReporter
.
これにより、各プラットフォームが独自のエラー表示を表示できるようになります - 例:
明らかに、エラー処理とエラー表示が必要な場合 (たとえば、非同期操作を再試行する場合や、代わりにデータのオフライン コピーをロードする場合) は、ViewModel および BaseViewModel 内のエラー処理にこれを追加できます。 .