我正在尝试在我的 monodroid 应用程序中实现有效的异常处理,该应用程序是用 Visual Studio 的 Xamarin.Android 插件编写的。
我正在尝试处理两种类型的异常:
- 在前台 (UI) 线程
- 在后台(线程池)线程
在全局处理程序的这两种情况下,我都想:
- 记录 - (提交分析事件)
- 用户通知 - (警报)
经过一定的调查后,我在此处、此处和此处找到了一些答案,但除了 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 中,尤其是后台任务。我有业务登录,如果出现错误应该中断,这正是我对运行时的期望。同时,我想在一个地方处理顶级异常,记录它们(基于我的业务规则)并继续执行应用程序。
如何处理异常并仍然能够使应用程序保持活动状态(防止崩溃)。
You can find complete code sample here: https://dl.dropboxusercontent.com/u/19503836/UnhandledException.zip
Thank you for your advice. Any help appreciated. TIA!