gpt4 book ai didi

c# - 单体机器人 : Unhandled Exception Recovery

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:42 27 4
gpt4 key购买 nike

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

我发现了 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();
}
}
}

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

最佳答案

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

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

关于c# - 单体机器人 : Unhandled Exception Recovery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978070/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com