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

时间:2015-10-18 11:34:20

标签: c# xamarin xamarin.ios xamarin.android

我们都知道移动设备是紧凑型平台,我们在构建应用程序时必须要看很多东西。它可以是任何例如Memory Performance Resolutions Architecture Implementation等等。我们永远不知道应用程序在玩应用程序时崩溃的时间和原因,可能随时发生< / p>

  

e.g。 App Launch,Load Screen,API Call,Binding Data,Loading Images等。

相信我有时很难找到应用程序中出现问题的位置和原因。我在论坛,技术社区和团体中看到了许多与同一问题有关的帖子,人们通常在这些问题上提出问题:

  1. 应用程序在启动时崩溃。
  2. 飞溅屏加载时崩溃。
  3. 图片显示时应用崩溃。
  4. 应用程序在绑定来自api的数据时崩溃。
  5. 如何识别问题及其原因?

2 个答案:

答案 0 :(得分:12)

目的:我们的目的是获取异常的堆栈跟踪数据,以帮助我们确定导致问题的原因是Release Mode还是Debug Mode。我们将能够理解问题以及导致问题的原因。我们将此数据存储在将存储在设备存储中的text文件中。

解决方案或者,您可以制作自己的洞察力抓取工具,为您提供应用洞察力,并在测试应用时出现问题。它将是你的,你可以像你想要的那样调整。让我们全球潜入try{}catch{}

创建一个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\n{1}\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
}
  

注意:您可以在Device Storage中找到例外记录文件文件管理器&gt;例外文件夹&gt; fatal.txt

干杯!!

see this link

Result Video

答案 1 :(得分:6)

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

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

Insights.HasPendingCrashReport += (sender, isStartupCrash) =>
{
  if (isStartupCrash) {
    Insights.PurgePendingCrashReports().Wait();
  }
};
Insights.Initialize("Your API Key");