重命名 crashlytics 上的错误
Rename errors on crashlitics
我有一个项目,其中所有错误和警告都写在 classes 发生的日志中。我开始使用 crashlytics。并尝试将所有连接到日志记录和错误的逻辑组合到特定的 class。并强制这个 class 决定在哪里报告错误(错误+警告)以及在哪里记录警告。但是当我完成它时,我开始收到所有错误,因为它们发生在 class 中。是否可以重命名错误?例如,在报告中手动添加 activity 名称,这样我将始终收到不同的错误而不是相同的错误。跟图片不一样
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)
}
}
}
}
实际问题的答案
... manually add activity name in the report so I will get different errors and not the same error all the time ...
答案很简短 - 不,这是不可能的(不付出巨大的努力)。
但是为什么呢?
Crashlytics 使用报告的可抛出对象的堆栈跟踪。使用此堆栈使我们能够获得跟踪异常发生的行的报告。
这意味着要在问题列表中创建另一个问题记录,您必须修改可抛出对象的堆栈跟踪。
TrimmedThrowableData
是收集堆栈跟踪数据报告的 class。如您所见,它获得了 throwable 的未修改堆栈跟踪。
很可能是唯一的解决方案
如果您想获得不同的堆栈跟踪 - 在使用 reportToCrashlytics
的地方创建 Exception
对象并将这些对象作为参数传递。或者抛出并捕获异常,并报告捕获到的异常。
上一个答案(发现错误)
您正在抛出导致应用程序崩溃的异常。您应该创建 Exception
对象并将其作为参数传入。
如果您打开 IDE,您将看到使用 throw
的行突出显示了 recordException
方法,如果将光标悬停在它上面,您将看到以下内容:
这意味着你永远不会执行 recordException
因为参数是先计算然后传递给函数的。但该功能永远无法实现,因为 throw
使应用程序崩溃。
不要使用throw
关键字:
FirebaseCrashlytics.getInstance().recordException(Exception(errorMessage))
您可以像这样更改您的堆栈跟踪:
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);
}
}
我有一个项目,其中所有错误和警告都写在 classes 发生的日志中。我开始使用 crashlytics。并尝试将所有连接到日志记录和错误的逻辑组合到特定的 class。并强制这个 class 决定在哪里报告错误(错误+警告)以及在哪里记录警告。但是当我完成它时,我开始收到所有错误,因为它们发生在 class 中。是否可以重命名错误?例如,在报告中手动添加 activity 名称,这样我将始终收到不同的错误而不是相同的错误。跟图片不一样
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)
}
}
}
}
实际问题的答案
... manually add activity name in the report so I will get different errors and not the same error all the time ...
答案很简短 - 不,这是不可能的(不付出巨大的努力)。
但是为什么呢?
Crashlytics 使用报告的可抛出对象的堆栈跟踪。使用此堆栈使我们能够获得跟踪异常发生的行的报告。
这意味着要在问题列表中创建另一个问题记录,您必须修改可抛出对象的堆栈跟踪。
TrimmedThrowableData
是收集堆栈跟踪数据报告的 class。如您所见,它获得了 throwable 的未修改堆栈跟踪。
很可能是唯一的解决方案
如果您想获得不同的堆栈跟踪 - 在使用 reportToCrashlytics
的地方创建 Exception
对象并将这些对象作为参数传递。或者抛出并捕获异常,并报告捕获到的异常。
上一个答案(发现错误)
您正在抛出导致应用程序崩溃的异常。您应该创建 Exception
对象并将其作为参数传入。
如果您打开 IDE,您将看到使用 throw
的行突出显示了 recordException
方法,如果将光标悬停在它上面,您将看到以下内容:
这意味着你永远不会执行 recordException
因为参数是先计算然后传递给函数的。但该功能永远无法实现,因为 throw
使应用程序崩溃。
不要使用throw
关键字:
FirebaseCrashlytics.getInstance().recordException(Exception(errorMessage))
您可以像这样更改您的堆栈跟踪:
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);
}
}