3

MVVMCross フレームワークを使用して iOS、Android、および WP7 用のクロス プラットフォーム アプリケーションを開発していますが、MvxApplication には、プラットフォームに依存しない未処理の例外ハンドラー (プラットフォーム固有のものによって呼び出される) として機能する、オーバーライドできるメソッドがありません。 )。

問題は、MVVMCross アプリケーションで例外を一般的に処理し、非同期呼び出し中に推奨される方法は何ですか?

ありがとう、アッティラ

4

1 に答える 1

3

本当に予期しない例外 (クラッシュ!) については、この質問には現在回答がありません: MonoTouch および MonoDroid でのクラッシュ レポートを参照してください。


ただし、非同期呼び出し中に例外を処理する方法に関する提案については、BestSellers の例をご覧ください: MvvmCross BestSellers Sample

BestSellers では、MvvmCross アプリケーションでかなり多く使用されている 2 つの手法を使用しています。

  • エラー処理などの共有 ViewModel コード用の BaseViewModel クラスの使用
  • アプリ レベルの「エラー ルーター」を使用して、ViewModel から UIAlertView、Toast、MessageBox などの UI 通知にエラーを取得します。

より詳細なレベルでは、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 内のエラー処理にこれを追加できます。 .

于 2012-05-02T10:16:30.997 に答える