MonoDroid:未处理的异常恢复
Posted
技术标签:
【中文标题】MonoDroid:未处理的异常恢复【英文标题】:MonoDroid: Unhandled Exception Recovery 【发布时间】:2013-04-05 09:02:45 【问题描述】:我正在尝试向我的应用程序添加一个默认处理程序,以便我可以从其他未处理的异常中恢复。
我发现了 android/MonoDroid 提供的三种机制,据我所知,它们应该可以实现这一点,但我无法让它们中的任何一种发挥作用。这是我的代码:
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();
任何帮助将不胜感激,谢谢!
【问题讨论】:
你有没有得到这个工作?我在不调试我的应用程序时看到了类似的问题。我可以告诉你AndroidEnvironment
在 AppDomain
之前被调用并处理未捕获的异常。
这不是“设置Handled flag=true”的方式,应该是e.Handled = true;
... :-B
【参考方案1】:
您可以在 AppDomain.CurrentDomain.UnhandledException 事件中捕获大部分异常。但是你不能在这个委托中调用 AlertDialog,因为: 1.应用程序崩溃。 2. UnhandledException 事件至少被调用。 3. alert.Show() 异步执行(在 UI 线程中)
因此,您应该使用同步操作(例如 System.IO)。您不应该使用原生 UI 操作,因为它们是异步的。
【讨论】:
以上是关于MonoDroid:未处理的异常恢复的主要内容,如果未能解决你的问题,请参考以下文章