c# - 处理全局异常机器人 | iOS

标签 c# xamarin xamarin.ios xamarin.android

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

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

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

  1. 应用在启动时崩溃。
  2. 应用程序在启动画面加载时崩溃。
  3. 显示图片时应用程序崩溃。
  4. 从 api 绑定(bind)数据时应用程序崩溃。

如何识别问题及其原因?

最佳答案

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


解决方案:或者,您可以制作自己的洞察力采集器,如果在测试应用程序时出现问题,它将为您提供应用程序洞察力和线索。这将是你的,你可以随心所欲地调整。让我们深入了解全局的 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
}

Note: You can find exceptions record file in Device Storage | File Manager > Exception Folder > fatal.txt

干杯!

关于c# - 处理全局异常机器人 | iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33197474/

相关文章:

iphone - 通过 tableview 添加 View (UITableViewController)

c# - MVC3 & JSON.stringify() ModelBinding 返回空模型

c# - 如何在 Mysql Left Join 中获取计数?

c# - 添加访问列表

Xamarin.Forms 删除页面

c# - ui 工具包中的错误一致性错误

c# - 08P01 : insufficient data left in message for Nullable DateTime

c# - Xamarin Forms Android 中任何页面的默认背景颜色是什么?

ios - iOS 17 中弃用了一堆 UIGraphics 方法,没有明确的替代方案?

绑定(bind)静态全局会导致 MonoTouch 中出现错误