我正在尝试在我的monodroid应用程序中使用Xamarin.Android插件为Visual Studio编写有效的异常处理。如何在全球范围内处理MonoDroid未捕获的异常并防止应用程序崩溃
我试图处理2种异常:
- 在前台(UI)线程
- 在背景(线程池)螺纹
在这两种情况下,在全球处理器I” m想要:
- 记录 - (提交分析事件)
- 用户通知 - (警报)
一定的调查后,我已经找到了一些答案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! TIA!
这种方法异常处理是设计非常差。例外情况应该在提出和预期的地方处理,而不是在全球范围内处理。一旦异常冒泡到全局处理程序,就会失去所有上下文和恢复状态的所有希望。 – 323go
谢谢您的意见,但我不能同意。我很明白,我同意在丢失背景之前处理异常,但我不同意在他们提出异议的情况下处理异常。成像我有DataAccess,业务逻辑和用户界面,我有UI级别的按钮启动一些数据访问操作,然后由业务逻辑处理,最终结果显示在UI上。如果在数据访问级别发生任何错误,我希望我的数据访问和业务逻辑被中断,并在UI级别显示结果。例外的是设计不是每一个方法调用之后检查错误... –
我同意,我希望我应该处理这个错误 - 在UI层面,而不是它被提出(在数据访问层)。在我的问题中,我正在讨论UI级别错误处理的一般方法(对UI错误处理程序无法记录错误进行映像)。在这种情况下,我仍然希望我的应用程序通知用户它,记录此后续错误,并让我的应用程序不会崩溃(在我的情况下,记录错误的失败不是一个关键问题)。我想要的是决定我的自我,如果应用程序应该被终止,当引发异常的异常时。 –