예제 #1
0
 public static void registerToUnity(OnError onError, bool logWarnings)
 {
     Application.logMessageReceivedThreaded += (message, backtrace, type) => {
         if (
             type == LogType.Assert || type == LogType.Error || type == LogType.Exception ||
             (logWarnings && type == LogType.Warning)
             )
         {
             ASync.OnMainThread(
                 () => {
                 try {
                     var parsedBacktrace =
                         // backtrace may be empty in release mode.
                         string.IsNullOrEmpty(backtrace)
         ? BacktraceElem.generateFromHere()
         : BacktraceElem.parseUnityBacktrace(backtrace);
                     var data = new ErrorData(type, message, parsedBacktrace);
                     onError(data);
                 }
                 catch (Exception e) {
                     // Log at info level so that we wouldn't trigger this handler again.
                     Log.info(
                         $"[{nameof(ErrorReporter)}] Exception in " +
                         $"{nameof(Application)}.{nameof(Application.logMessageReceivedThreaded)}" +
                         $" handler!\n\n{e}"
                         );
                 }
             },
                 // https://fogbugz.unity3d.com/default.asp?832198_48nbh0a3a8cjpr12
                 runNowIfOnMainThread: false
                 );
         }
     };
 }
예제 #2
0
        public static void registerToUnity(OnError onError, bool logWarnings)
        {
            Action <Exception> logExceptionSafe = e => {
                ASync.OnMainThread(
                    () => {
                    // Log at info level so that we wouldn't trigger this handler again.
                    Log.info(
                        $"[{nameof(ErrorReporter)}] Exception in " +
                        $"{nameof(Application)}.{nameof(Application.logMessageReceivedThreaded)}" +
                        $" handler!\n\n{e}"
                        );
                },
                    // https://fogbugz.unity3d.com/default.asp?832198_48nbh0a3a8cjpr12
                    runNowIfOnMainThread: false
                    );
            };

            Application.logMessageReceivedThreaded += (message, backtrace, type) => {
                if (
                    type == LogType.Assert || type == LogType.Error || type == LogType.Exception ||
                    logWarnings && type == LogType.Warning
                    )
                {
                    try {
                        // We want to collect backtrace on the current thread
                        var parsedBacktrace =
                            // backtrace may be empty in release mode.
                            string.IsNullOrEmpty(backtrace)
                ? BacktraceElem.generateFromHere(1)
                : BacktraceElem.parseUnityBacktrace(backtrace);
                        var data = new ErrorData(type, message, parsedBacktrace);
                        // But call our error handler on main thread
                        // because handlers are not guaranteed to be thread safe
                        // and Log.info would not work in our handler
                        ASync.OnMainThread(
                            () => {
                            try { onError(data); }
                            catch (Exception e) { logExceptionSafe(e); }
                        },
                            runNowIfOnMainThread: false
                            );
                    }
                    catch (Exception e) { logExceptionSafe(e); }
                }
            };
        }