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

前端之家收集整理的这篇文章主要介绍了android – 如何在全局处理MonoDroid未捕获的异常,并防止应用程序崩溃前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在我的monodroid应用程序中实现有效的异常处理,这是用Visual Studio的Xamarin. Android插件编写的.

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

>在foreground(UI)线程
>在background(threadpool)线程

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

>记录 – (提交分析事件)
>用户通知 – (提醒)

经过一些调查,我找到了一些答案here,herehere,但除了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;
};

然后在按钮上点击我添加了以下代码来提出两种类型的异常:

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

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

>前景:

>两个处理程序都被提高
>这是不可能防止应用程序的存在
崩溃 – 它将以任何方式崩溃(e.Handled = true只是被忽略)

>背景:

>只有第二个处理程序被提出
>应用程序不会崩溃

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

如何处理这两个异常,仍然有能力保持应用程序活动(防止崩溃).

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

感谢您的建议.任何帮助赞赏.
TIA!

解决方法

这些事件处理程序不是为了让您从异常中恢复,它们是在应用程序终止之前给您机会执行类似写入错误日志的机会的最后手段.

你提到你想记录错误 – 这应该是正常的,但是向用户显示一个错误可能是不可能的,因为你的应用程序将达到一个甚至不能做到这一点.

作为对您的问题提及的评论,处理这样的异常是一个坏主意.

虽然您可能对此将被称为非常具体的期望,但您的应用可能会在任何时候抛出异常 – 并且出于任何原因.它是不可能设计,以便它正确处理一切.

即使您能够安全地处理任何异常情况,您的应用仍将被终止,因为未处理的异常.

关于AppDomain.CurrentDomain.UnhandledException的Microsoft文档提供了一些有关这方面的更多信息:

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

猜你在找的Android相关文章