7

未処理の例外から回復できるように、アプリケーションに既定のハンドラーを追加しようとしています。

私が知る限り、Android/MonoDroid が提供する 3 つのメカニズムがこれを可能にするはずですが、それらのいずれも機能させることができません。これが私のコードです:

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace TestApp {
    [Android.App.Activity(Label = "TestApp", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity {
        protected override void OnCreate(Bundle bundle) {
            base.OnCreate(bundle);
            SetContentView(new LinearLayout(this));

            //set up handlers for uncaught exceptions:
            //Java solution
            Java.Lang.Thread.DefaultUncaughtExceptionHandler = new ExceptionHandler(this);
            //MonoDroid solution #1
            AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironment_UnhandledExceptionRaiser;
            //MonoDroid solution #2
            AppDomain.CurrentDomain.UnhandledException += delegate { new Alert(this, "AppDomain.CurrentDomain.UnhandledException", "error"); };

            //throw an exception to test
            throw new Exception("uncaught exception");
        }

        void AndroidEnvironment_UnhandledExceptionRaiser(object sender, RaiseThrowableEventArgs e)
        {
            //found a suggestion to set the Handled flag=true, but it has no effect
            new Android.Runtime.RaiseThrowableEventArgs(e.Exception).Handled = true;
            new Alert(this, "AndroidEnvironment.UnhandledExceptionRaiser", "error");
        }
    }

    public class ExceptionHandler : Java.Lang.Object, Java.Lang.Thread.IUncaughtExceptionHandler {
        private Context _context;
        public ExceptionHandler(Context c) { _context = c; }
        public void UncaughtException(Java.Lang.Thread thread, Java.Lang.Throwable ex) {
            new Alert(_context, "java exception handler");
        }
    }

    public class Alert {
        public Alert(Context c, string src, string title = "alert") {
            Android.App.AlertDialog.Builder builder = new Android.App.AlertDialog.Builder(c);
            builder.SetTitle(title);
            builder.SetMessage(src);
            builder.SetPositiveButton("Ok", delegate { });
            Android.App.AlertDialog alert = builder.Create();
            alert.Show();
        }
    }
}

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

-1

You can catch most of exceptions in AppDomain.CurrentDomain.UnhandledException event. But you can't call AlertDialog in this delegate, because: 1. Application is crashed. 2. UnhandledException event is called at least. 3. alert.Show() is executed async (in UI thread)

So, you should use sync operations (System.IO, for example). You shouldn't use native UI operations, because they are async.

于 2014-02-24T08:02:09.913 に答える