避免在未处理的异常后Mac应用程序崩溃

时间:2014-05-28 10:39:17

标签: macos xamarin monomac

我希望在发出未处理的异常后阻止我的应用关闭。

我是用Xamarin和MonoMac做的,但我想我可以将Objective-C的答案翻译成C#。

当异常发生并且没有被捕获时,我会注册未处理的异常事件:

AppDomain.CurrentDomain.UnhandledException += HandleUnhandledException;

并记录下来:

static void HandleUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    //Log the exception...
}

但是,当发生异常时,会执行HandleUnhandledException并退出事件循环:

NSApplication.Main(args);

所以我的应用程序结束了。我怎么能避免这个?我应该在哪里放置try-catch块?

2 个答案:

答案 0 :(得分:3)

这就是xamarin开发者中心所说的:

"您可以向AppDomain.CurrentDomain.UnhandledException事件添加事件处理程序,当未处理的托管异常发生时,您会收到通知(请注意,只要您从事件中返回,应用就会退出处理程序,无论你做什么,所以几乎唯一的目的是收集诊断信息。它也只会捕获托管异常,而不是本机崩溃,这是退出应用程序的另一个原因。)"

所以,显然,你可以添加一个全局try catch块,但这只是告诉你托管异常,app会在try catch结束时退出。所以它不能完全满足你的目的。

答案 1 :(得分:0)

好吧,我知道这有点老了,但是我也很挣扎了好几个月,因为我的应用程序在没有任何堆栈跟踪的情况下崩溃了......但是! ...我经过多次尝试后想出来,并且在这里和那里捕获,您可以将以下内容放入AppDelegate.cs类的构造函数中:

            AppDomain.CurrentDomain.UnhandledException += (object sender, UnhandledExceptionEventArgs e) => {
                Exception GivenException = (Exception) e.ExceptionObject;
                Console.WriteLine( GivenException.Message);
                Console.WriteLine( GivenException.StackTrace);
                Console.WriteLine("Runtime terminating: {0}", e.IsTerminating);
            };

这不会避免应用程序终止,但至少你会确切地知道在哪里寻找并解决问题。