处理全局异常 Xamarin |机器人 | iOS

Posted

技术标签:

【中文标题】处理全局异常 Xamarin |机器人 | iOS【英文标题】:Handling Global Exception Xamarin | Droid | iOS 【发布时间】:2016-01-16 19:12:05 【问题描述】:

我们都知道移动是一个紧凑的平台,我们在构建应用程序时必须查看很多东西。它可以是任何东西,例如Memory Performance Resolutions Architecture Implementation 等等。我们永远不知道什么时候以及是什么原因导致应用程序崩溃,这是玩应用程序时的一个大问题,它随时可能发生

例如应用启动、加载屏幕、API 调用、绑定数据、加载图片等

相信我,有时很难找到导致应用程序出现问题的位置和原因。我在论坛、技术社区和群组上看到了许多与同一问题相关的帖子,人们通常会提出以下问题:

    应用程序在启动时崩溃。 加载启动画面时应用程序崩溃。 显示图像时应用程序崩溃。 从 api 绑定数据时应用程序崩溃。

如何识别问题及其原因?

【问题讨论】:

【参考方案1】:

目的:我们在这里的目的是获取异常的堆栈跟踪数据,以帮助我们确定导致问题的确切原因,无论是在Release Mode 还是Debug Mode。我们将能够了解问题及其原因。我们会将这些数据存储在一个text 文件中,该文件将存储在设备存储中。


解决方案: 或者,您可以制作自己的洞察力采集器,如果在测试应用程序时出现问题,它会为您提供应用程序洞察力和线索。它会是你的,你可以随心所欲地调整。让我们在全球范围内深入了解trycatch

创建一个Helper Class 文件,该文件具有为异常数据生成文本文件的方法。

public static class ExceptionFileWriter

    #region Property File Path

    static string FilePath
    
        get
        
            string path = string.Empty;
            var _fileName = "Fatal.txt";
#if __ios__
            string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // Documents folder C:\ddddd
            string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder C:\dddd\...\library
            path = Path.Combine(libraryPath, _fileName); //c:\ddddd\...\library\NBCCSeva.db3
#else
#if __android__
            string dir = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.ToString(), "Exception");
        if (Directory.Exists(dir))
            return Path.Combine(dir, _fileName);
        path= Path.Combine(Directory.CreateDirectory(dir).FullName, _fileName);
#endif
#endif
            return path;
        
    

    #endregion

    #region ToLog Exception

    public static void ToLogUnhandledException(this Exception exception)
    
        try
        
            var errorMessage = String.Format("Time: 0\r\nError: Unhandled Exception\r\n1\n\n", DateTime.Now, string.IsNullOrEmpty(exception.StackTrace) ? exception.ToString() : exception.StackTrace);
            File.WriteAllText(FilePath, errorMessage);
        
        catch (Exception ex)
        
            // just suppress any error logging exceptions
        
    

    #endregion


是时候实现代码了:在应用的 Application 文件或 Splash Activity 中订阅以下事件。在这种情况下,我使用的是应用程序。

AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;

[Application]
public class ExceptionHandlingApp : Application

    #region Constructor

    public ExceptionHandlingApp(IntPtr javaReference, JniHandleOwnership transfer)
        : base(javaReference, transfer)
    

    

    #endregion

    #region OnCreate

    public override void OnCreate()
    
        base.OnCreate();
        AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
        TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
    

    #endregion

    #region Task Schedular Exception

    private static void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs)
    
        var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", unobservedTaskExceptionEventArgs.Exception);
        newExc.ToLogUnhandledException();
    

    #endregion

    #region Current Domain Exception

    private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
    
        var newExc = new Exception("CurrentDomainOnUnhandledException", unhandledExceptionEventArgs.ExceptionObject as Exception);
        newExc.ToLogUnhandledException();
    

    #endregion

注意:您可以在设备存储中找到异常记录文件|文件管理器 > 异常文件夹 > fatal.txt

干杯!!

【讨论】:

【参考方案2】:

除了您自己做之外,您还可以使用Xamarin.Insights,因为它对 Xamarin 用户免费使用,并且已经为所有平台提供了实现。 您无需用户手动向您发送日志文件即可在线接收使用情况报告、崩溃报告等。

要接收崩溃报告,您唯一需要做的就是在应用启动时初始化 Xamarin.Insights:

Insights.HasPendingCrashReport += (sender, isStartupCrash) =>

  if (isStartupCrash) 
    Insights.PurgePendingCrashReports().Wait();
  
;
Insights.Initialize("Your API Key");

【讨论】:

当然可以使用 感谢添加,但我猜它与商业版一起使用。如果我错了,请纠正我。 至少在今天,它对所有 Xamarin 客户都是免费且不受限制的。当 Xamarin.Insights 发布时,有这样一句话关于定价:定价将在预览版结束时公布,但将为 Xamarin 订阅者免费提供一个慷慨的计划。 blog.xamarin.com/monitoring-your-apps-with-xamarin-insights 嗯,很好:) 感谢分享@Wosi。 同样在下一个 Xamarin Studio 版本中,Insights 将集成在 Studio 中,我们不必手动输入此代码,很酷的东西 *注意:与 2018 年一样,App Center 取代 Xamarin.Insights 作为 Microsoft 的移动应用分析和崩溃报告服务。

以上是关于处理全局异常 Xamarin |机器人 | iOS的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 中的全局异常处理

在xamarin表单中处理api请求的一个地方处理异常

在一个地方处理 xamarin 表单中 api 请求的异常

iOS - 全局异常处理程序

在 Xamarin 应用程序中实例化 CloudStorageAccount 会导致未处理的异常

Java中的全局异常处理