首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoDroid:未处理的异常恢复

MonoDroid:未处理的异常恢复
EN

Stack Overflow用户
提问于 2013-04-13 02:08:08
回答 1查看 970关注 0票数 7

我正在尝试向我的应用程序添加一个默认的处理程序,这样我就可以从其他未处理的异常中恢复。

我发现Android/MonoDroid提供的三种机制,据我所知,应该可以让这一切成为可能,但我无法让它们中的任何一种工作。下面是我的代码:

代码语言:javascript
复制
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();
        }
    }
}

如有任何帮助,将不胜感激,谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-02-24 16:02:10

您可以在AppDomain.CurrentDomain.UnhandledException事件中捕获大多数异常。但是你不能在这个委托中调用AlertDialog,因为: 1.应用程序崩溃了。2.至少调用UnhandledException事件。3. alert.Show()异步执行(在UI线程中)

因此,您应该使用同步操作(例如System.IO)。你不应该使用原生UI操作,因为它们是异步的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15978070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档