我正在尝试处理两种类型的异常:
>在foreground(UI)线程
>在background(threadpool)线程
在这两种情况下,在全局处理程序我想:
经过一些调查,我找到了一些答案here,here和here,但除了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