【问题标题】:Rename errors on crashlitics重命名 crashlytics 上的错误
【发布时间】:2020-08-21 23:46:57
【问题描述】:

我有一个项目,其中所有错误和警告都写在发生它们的类的日志中。我开始使用 crashlytics。并尝试将与日志记录和错误相关的所有逻辑组合到特定类。并强制此类决定在哪里报告错误(错误+警告)以及在哪里记录警告。但是当我做到这一点时,我开始收到所有错误,因为它们发生在这堂课上。是否可以重命名错误?例如,在报告中手动添加活动名称,这样我会得到不同的错误,而不是一直得到相同的错误。不像图片上的。

    class AppLogs {
        companion object CrashReport {
            private fun reportToCrashlytics(
                errorMessage: String,
                user: String = "user id",
                log: String = "log",
                additionalInfoTitle: String = "title",
                additionalInfoMessage: String = " message"
            ) {
                FirebaseCrashlytics.getInstance().log(log)
                FirebaseCrashlytics.getInstance().setUserId(user)
                FirebaseCrashlytics.getInstance()
                    .setCustomKey(additionalInfoTitle, additionalInfoMessage)
                FirebaseCrashlytics.getInstance().recordException(throw Exception(errorMessage))
            }
    
            private fun reportLog(errorMessage: String) {
                Timber.e(errorMessage)
            }
    
            fun report(errorMessage: String, errorType: Char) {
                if (errorType == 'e') {
                    reportLog(errorMessage)
                    reportToCrashlytics(errorMessage)
                } else {
                    reportLog(errorMessage)
                }
            }
        }
    }

【问题讨论】:

    标签: android firebase kotlin crashlytics


    【解决方案1】:

    实际问题的解答

    ...在报告中手动添加活动名称,这样我会得到不同的错误,而不是一直收到相同的错误...

    答案很简短——不,这是不可能的(无需付出巨大的努力)。

    但是为什么呢?

    Crashlytics 使用所报告的可抛出对象的堆栈跟踪。使用此堆栈,我们可以获取跟踪异常发生的行的报告。

    这意味着要在问题列表中创建另一个问题记录,您必须修改可抛出对象的堆栈跟踪。

    TrimmedThrowableData 是收集堆栈跟踪数据以报告的类。如您所见,它获得了未修改的 throwable 堆栈跟踪。

    很可能是唯一的解决方案

    如果您想获得不同的堆栈跟踪 - 创建使用 reportToCrashlyticsException 对象并将这些对象作为参数传递。或者抛出和捕获异常,并报告捕获的异常。


    上一个答案(发现错误)

    您正在引发导致应用程序崩溃的异常。您应该创建 Exception 对象并将其作为参数传入。

    如果您打开 IDE,您将看到使用 throw 的行突出显示了 recordException 方法,如果您将光标悬停在它上面,您将看到以下内容:

    这意味着你永远不会执行recordException,因为参数首先被评估然后传递给函数。但由于throw 使应用程序崩溃,因此永远无法访问该函数。

    不要使用throw关键字:

    FirebaseCrashlytics.getInstance().recordException(Exception(errorMessage))
    

    【讨论】:

    • 这并不能真正帮助我解决我的问题,但谢谢。
    • @KeitL,我最初误解了这个问题。我认为您的应用程序每次尝试记录错误时都会崩溃,因此您会获得位于CrashReport 的崩溃日志。我会更新我的答案,但对您的问题的简短回答是 - 不,无法设置活动名称或类似信息。我会解释的。
    【解决方案2】:

    您可以像这样更改您的堆栈跟踪:

    public class CustomException extends Exception {
    
    public CustomException(String message, int lineNumber) {
        super(message);
        StackTraceElement[] stackTrace = getStackTrace();
        StackTraceElement[] newStackTrace = new StackTraceElement[stackTrace.length + 1];
        System.arraycopy(stackTrace, 0, newStackTrace, 1, stackTrace.length);
        newStackTrace[0] = new StackTraceElement("className", "methodName", "fileName", lineNumber);
        setStackTrace(newStackTrace);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2018-01-15
      • 2014-01-31
      • 2013-06-17
      相关资源
      最近更新 更多