169 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace ThinkingData.Analytics.TDException
 | |
| {
 | |
|     public class TDExceptionHandler
 | |
|     {
 | |
| 
 | |
|         //Whether to exit the program when an exception occurs
 | |
|         public static bool IsQuitWhenException = false;
 | |
| 
 | |
|         //Whether the exception catch has been registered
 | |
|         public static bool IsRegistered = false;
 | |
|         private static TDAutoTrackEventHandler mEventCallback;
 | |
|         private static Dictionary<string, object> mProperties;
 | |
| 
 | |
| 
 | |
|         public static void SetAutoTrackProperties(Dictionary<string, object> properties)
 | |
|         {
 | |
|             if (!(mProperties is Dictionary<string, object>))
 | |
|             {
 | |
|                 mProperties = new Dictionary<string, object>();
 | |
|             }
 | |
| 
 | |
|             foreach (var item in properties)
 | |
|             {
 | |
|                 if (!mProperties.ContainsKey(item.Key))
 | |
|                 {
 | |
|                     mProperties.Add(item.Key, item.Value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static void RegisterTAExceptionHandler(TDAutoTrackEventHandler eventCallback)
 | |
|         {
 | |
|             mEventCallback = eventCallback;
 | |
|             //Register exception handling delegate
 | |
|             try
 | |
|             {
 | |
|                 if (!IsRegistered)
 | |
|                 {
 | |
|                     Application.logMessageReceived += _LogHandler;
 | |
|                     AppDomain.CurrentDomain.UnhandledException += _UncaughtExceptionHandler;
 | |
|                     IsRegistered = true;
 | |
|                 }
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|             }            
 | |
|         }
 | |
| 
 | |
|         public static void RegisterTAExceptionHandler(Dictionary<string, object> properties)
 | |
|         {
 | |
|             SetAutoTrackProperties(properties);
 | |
|             //Register exception handling delegate
 | |
|             try
 | |
|             {
 | |
|                 if (!IsRegistered)
 | |
|                 {
 | |
|                     Application.logMessageReceived += _LogHandler;
 | |
|                     AppDomain.CurrentDomain.UnhandledException += _UncaughtExceptionHandler;
 | |
|                     IsRegistered = true;
 | |
|                 }
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static void UnregisterTAExceptionHandler ()
 | |
|         {
 | |
|             //Clear exception handling delegate
 | |
|             try
 | |
|             {
 | |
|                 Application.logMessageReceived -= _LogHandler;
 | |
|                 System.AppDomain.CurrentDomain.UnhandledException -= _UncaughtExceptionHandler;
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|             }
 | |
|         }
 | |
|     
 | |
|     
 | |
|         private static void _LogHandler( string logString, string stackTrace, LogType type )
 | |
|         {
 | |
|             if( type == LogType.Error || type == LogType.Exception || type == LogType.Assert )
 | |
|             {
 | |
|                 //Report exception event
 | |
|                 string reasonStr = "exception_type: " + type.ToString() + " <br> " + "exception_message: " + logString + " <br> " + "stack_trace: " + stackTrace + " <br> " ; 
 | |
|                 Dictionary<string, object> properties = new Dictionary<string, object>(){
 | |
|                     {"#app_crashed_reason", reasonStr}
 | |
|                 };
 | |
|                 properties = MergeProperties(properties);
 | |
|                 TDAnalytics.Track("ta_app_crash", properties);
 | |
| 
 | |
|                 if ( IsQuitWhenException )
 | |
|                 {
 | |
|                     Application.Quit();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static void _UncaughtExceptionHandler (object sender, System.UnhandledExceptionEventArgs args)
 | |
|         {
 | |
|             if (args == null || args.ExceptionObject == null)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
|             
 | |
|             try
 | |
|             {
 | |
|                 if (args.ExceptionObject.GetType () != typeof(System.Exception))
 | |
|                 {
 | |
|                     return;
 | |
|                 }
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             System.Exception e = (System.Exception)args.ExceptionObject;
 | |
| 
 | |
|             //Report exception event
 | |
|             string reasonStr = "exception_type: " + e.GetType().Name + " <br> " + "exception_message: " + e.Message + " <br> " + "stack_trace: " + e.StackTrace + " <br> " ; 
 | |
|             Dictionary<string, object> properties = new Dictionary<string, object>(){
 | |
|                 {"#app_crashed_reason", reasonStr}
 | |
|             };
 | |
|             properties = MergeProperties(properties);
 | |
|             TDAnalytics.Track("ta_app_crash", properties);
 | |
| 
 | |
|             if ( IsQuitWhenException )
 | |
|             {
 | |
|                 Application.Quit();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static Dictionary<string, object> MergeProperties(Dictionary<string, object> properties)
 | |
|         {
 | |
| 
 | |
|             if (mEventCallback is TDAutoTrackEventHandler)
 | |
|             {
 | |
|                 Dictionary<string, object> callbackProperties = mEventCallback.GetAutoTrackEventProperties((int)TDAutoTrackEventType.AppCrash, properties);
 | |
|                 foreach (var item in callbackProperties)
 | |
|                 {
 | |
|                     if (!properties.ContainsKey(item.Key))
 | |
|                     {
 | |
|                         properties.Add(item.Key, item.Value);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (mProperties is Dictionary<string, object>)
 | |
|             {
 | |
|                 foreach (var item in mProperties)
 | |
|                 {
 | |
|                     if (!properties.ContainsKey(item.Key))
 | |
|                     {
 | |
|                         properties.Add(item.Key, item.Value);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return properties;
 | |
|         }
 | |
|     }
 | |
| }
 |