gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 19:06:25 25 4
gpt4 key购买 nike

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

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

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

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

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

经过一定的调查我找到了一些答案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.");
});

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

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

在我的例子中,我无法将每个用户操作都包装在 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 - 如何全局处理MonoDroid未捕获的异常并防止应用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19507452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com