如何全局处理MonoDroid未捕获的异常并防止应用程序崩溃

Ale*_*akh 14 android exception-handling unhandled-exception xamarin.android xamarin

我正在尝试在我的monodroid应用程序中实现有效的异常处理,该应用程序是用Visual Studio的Xamarin.Android插件编写的.

我正在尝试处理两种类型的异常:

  1. 在前台(UI)线程
  2. 在后台(线程池)线程

在全局处理程序的两种情况下,我想:

  • 记录 - (提交分析事件)
  • 用户通知 - (提醒)

经过一定的调查后,我这里这里找到了一些答案,但除了AndroidEnvironment.UnhandledExceptionRaiser和AppDomain.UnhandledException之外什么都没有提出,它并不适用于所有情况.

我创建了一个简短的示例,我试图使用这两个处理程序:

AppDomain.CurrentDomain.UnhandledException += (s,e)=>
{
    System.Diagnostics.Debug.WriteLine("AppDomain.CurrentDomain.UnhandledException: {0}. IsTerminating: {1}", e.ExceptionObject, e.IsTerminating);
};

AndroidEnvironment.UnhandledExceptionRaiser += (s, e) =>
{
    System.Diagnostics.Debug.WriteLine("AndroidEnvironment.UnhandledExceptionRaiser: {0}. IsTerminating: {1}", e.Exception, e.Handled);
    e.Handled = true;
};
Run Code Online (Sandbox Code Playgroud)

然后在按钮单击时,我添加了以下代码以引发两种类型的异常:

//foreground exception
throw new NullReferenceException("test nre from ui thread.");
//background exception
ThreadPool.QueueUserWorkItem(unused =>
{
    throw new NullReferenceException("test nre from back thread.");
});
Run Code Online (Sandbox Code Playgroud)

因此,我对两种类型的异常都有不同的行为:

  1. 前景:
    • 两个处理程序都被提升了
    • 不可能阻止app崩溃 - 它会以任何方式崩溃(e.Handled = true只是被忽略)
  2. 背景:
    • 只引发第二个处理程序
    • 应用程序不会崩溃

在我的情况下,我无法在try-catch中包装每个用户操作,尤其是后台任务.我有业务登录,如果出现错误应该被中断,这正是我对运行时的期望.同时我想在一个地方的顶层处理这些异常,记录它们(根据我的业务规则)并继续执行应用程序.

如何处理这两个异常并仍然能够使应用程序保持活动状态(防止崩溃).

您可以在此处找到完整的代码示例:https: //dl.dropboxusercontent.com/u/19503836/UnhandledException.zip

感谢您的意见.任何帮助赞赏.TIA!

Dav*_*c64 8

这些事件处理程序并非旨在让您异常中恢复,它们是最后的手段,可以让您在应用程序终止之前执行类似写入错误日志的操作.

您已经提到要记录错误 - 这应该可以正常工作,但是可能无法向用户显示错误,因为您的应用程序已达到甚至无法执行此操作的程度.

正如您对问题的评论所提到的,处理这样的异常是一个坏主意.

虽然您可能对何时调用此函数有非常具体的期望,但您的应用程序可能会在任何时候抛出异常 - 无论出于何种原因.它是不可能设计它,以便它正确处理一切.

即使您可以安全地编写一些内容来处理任何异常,您的应用程序仍会因未处理的异常而终止.

AppDomain.CurrentDomain.UnhandledException的Microsoft文档提供了有关此内容的更多信息:

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

  • @ Daveo64全局异常处理非常重要,以防您在运行时无法计划某些事情。我的Windows Phone应用程序从未崩溃过。他们为什么要这样?我的所有应用程序都不会崩溃,而不会向用户显示有关该错误的通知,然后询问用户是否要关闭该应用程序或继续使用它。请告诉我,这还不够礼貌吗?Android让我恶心,因为我找不到相同的解决方案。 (2认同)