6

最近、Xamarin Android を使用したモバイル開発を学び始めました。私は VS 2012 を使用しています。Android プロジェクトを開くと、Debug -> Exceptions の下のすべての例外がチェックされていないことに気付きました。これが、コードでスローされた例外が、デスクトップ開発で慣れ親しんだ方法で表示されない理由だと思いました。[デバッグ] -> [例外] ウィンドウで例外を確認し、ソリューションをエミュレータにデプロイしようとすると失敗しました。エラーはありませんでしたが、エミュレータでアプリケーションが起動しません。

私の質問は、VS 2012 または VS 2010 とエミュレーターを使用して Android 向けに開発するときの通常の動作ですか? 出力ウィンドウだけでなく、「通常の方法」でスローされた例外を確認する方法はありますか? デバッグに実際の Android デバイスを使用した場合、それは変わりますか?

4

4 に答える 4

5

私の答えはNOです

なんで?

Android の Unhandled 例外の性質について理解しなければならない重要なことが 1 つあります。それはありません。Android では Uncaught 例外であり、「処理」したり、自分のように回復したりすることはできませんおそらく.Net環境ではそうでしょう。

Xamarin(Mono) は、文字通りすべてを try-catch で囲み、Unhandled イベントを発生させることで、キャッチされなかった例外を内部的に "処理" しますが、それは重要ではありません。また、さまざまな理由から、UI を操作することもお勧めできません。

理論的には、ユーザーにダイアログを表示したり、アプリを再起動したりするための「回避策」がいくつかありますが、どれもお勧めできません。代わりに、予想される例外を処理するために機密領域を try-catch 句で囲む必要があります。予期しない例外については、例外レポート コンポーネントを使用し、報告された例外を分析した後にアプリを更新するだけです。

からの説明

また、このようにアプリから未処理の例外をキャッチすることもできます

名前が ErrorActivityのようなベース アクティビティを作成します。

この例を見てください

protected override void OnCreate(Bundle bundle)
 {
        //register error handlers
                    AppDomain.CurrentDomain.UnhandledException += ErrorHandler.CurrentDomainOnUnhandledException;
                    TaskScheduler.UnobservedTaskException += ErrorHandler.TaskSchedulerOnUnobservedTaskException;
  }

エラーハンドラクラス内

public static class ErrorHandler
    {
        /// <summary>
        ///     Tasks the scheduler on unobserved task exception.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="unobservedTaskExceptionEventArgs">
        ///     The <see cref="UnobservedTaskExceptionEventArgs" /> instance containing
        ///     the event data.
        /// </param>
        public static void TaskSchedulerOnUnobservedTaskException(object sender,
            UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs)
        {
            var newExc = new Exception("TaskSchedulerOnUnobservedTaskException",
                unobservedTaskExceptionEventArgs.Exception);
            LogUnhandledException(newExc);
        }

        /// <summary>
        ///     Currents the domain on unhandled exception.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="unhandledExceptionEventArgs">
        ///     The <see cref="UnhandledExceptionEventArgs" /> instance containing the event
        ///     data.
        /// </param>
        public static void CurrentDomainOnUnhandledException(object sender,
            UnhandledExceptionEventArgs unhandledExceptionEventArgs)
        {
            var newExc = new Exception("CurrentDomainOnUnhandledException",
                unhandledExceptionEventArgs.ExceptionObject as Exception);
            LogUnhandledException(newExc);
        }

        /// <summary>
        ///     Logs the unhandled exception.
        /// </summary>
        /// <param name="exception">The exception.</param>
        internal static void LogUnhandledException(Exception exception)
        {
            try
            {
                string error =
                    $"Exception Caught:{DateTime.Now:F} The Error Message IS {exception.Message}\n\r full stack trace is {exception.ToString()} ";
#if DEBUG
                const string errorFileName = "errorlog.txt";
                var libraryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
                // iOS: Environment.SpecialFolder.Resources
                var errorFilePath = System.IO.Path.Combine(libraryPath, errorFileName);
                System.IO.File.WriteAllText(errorFilePath, error);
                Android.Util.Log.Error("Crash Report error not handled", ex.ToString());
    #else
                    // Log to Android Device Logging.
                    Android.Util.Log.Error("Crash Report", error);
    #endif
                }
                catch (Exception ex)
                {
                    Android.Util.Log.Error("Crash Report error not handled", ex.ToString());
                    // just suppress any error logging exceptions
                }
            }
        }

これで、このように ErrorActivity からすべてのアクティビティを継承できます

Public class Fooactivity:ErrorActivity
{
}

これで、アプリでエラーを処理できます..だから、ログファイルからエラーログを取得します..またはAndroidデバイスのロギングモニター..これが役立つことを願っています...

于 2015-09-24T07:19:51.187 に答える
5

たぶん、私は十分に明確ではありませんでした。Visual Studio でのコード実行は中断しますが、デスクトップ向けのプログラミング時に発生する例外を調査するために使用される標準ウィンドウの代わりに、ウィンドウにはスローされた例外の名前のみが含まれ、このタイプの場合にコード中断を無効にするチェックボックスが含まれます。例外がスローされ、Break、Continue、および Ignore ボタンが表示されます。しかし、デスクトップ向けのプログラミングで利用できる方法で実際の例外を調査することはできません。

ダイアログ ボックスでチェックボックスDebug --> Exceptionsをクリックすると、解決する例外のより意味のある説明が表示されます。ThrownCommon Language Runtime Exceptions

ここに画像の説明を入力

明らかに、もう 1 つの重要な点は、Break ボタンをクリックして、コール スタックの内容を確認することです。

于 2015-09-24T06:40:17.373 に答える
0

私もXamarinは初めてです。簡単な答えはノーです。これはあなたが期待するものではありません。

アプリケーションがデバイスで実行されているときに例外が発生すると、Visual Studio で中断します。最善の策は、Xamarin に直接連絡するか、フォーラムにアクセスすることです。

于 2013-06-21T12:16:34.080 に答える