Wtf()和 Log.e()有什么不同?

我已经看了 Android.util.Log 的文档,但是我不确定 Log.e()Log.wtf()之间到底有什么不同。一个比另一个更受欢迎吗?在功能上有区别吗?他们肯定不是多余的。

给未来读者的注意 : 在提出这个问题的时候,关于这个问题的文档还不是很清楚。如果你按照上面的链接,他们已经解决了这个问题。

43683 次浏览

我认为这个卧槽(多么可怕的失败)是用来报告应用程序的严重异常/问题的(例如,在调试控制台中报告它们)。

E 用于报告错误,但没有那么严重。

严重程度有所不同;

Log.e()将简单地将错误记录到优先级为 ERROR 的日志中。

Log.wtf()将使用优先级 ASSERT 记录错误,并可能(取决于系统配置)发送错误报告并立即终止程序。

与其他日志类型一样,我认为它只是日志消息的另一种标签类型。I 表示发生事件的位置的信息。E 表示可能发生的错误。Wtf 表示从未发生的错误。我认为这只是一种方便,这样你就不会有日志(“ ERROR:”,“ an ERROR”)和日志(“ INFO:”,“ information”)之类的东西了

Log.e()是将错误简单地记录到日志中,优先级为 ERROR。

Log.wtf()(多么可怕的故障)比错误日志更严重。这个从来没有发生过的错误。在终止程序之前,它可能会强制设备保持写入日志。

事实上,这可能是 Android SDK 中的一个文档错误,多么令人惊讶... ... Doc 说:

错误将始终在 ASSERT 级别与调用堆栈一起记录。

但是源代码显示:

static int wtf(int logId, String tag, String msg, Throwable tr, boolean localStack, boolean system) {


...


int bytes = printlns(logId, ERROR, tag, msg, localStack ? what : tr);


...
}

因此,Log.wtf ()和 Log.e ()具有相同的优先级 ERROR。

不同之处在于,Log.wtf ()调用 onTaibleFalse ()回调,该回调“报告当前流程中的严重错误。可能会或不会导致进程终止(取决于系统设置)。”

所以,换句话说,Log.wtf ()可能会使您的应用程序崩溃。

下面是一段代码:

if (ActivityManager.getService().handleApplicationWtf(
mApplicationObject, tag, system,
new ApplicationErrorReport.ParcelableCrashInfo(t))) {
// The Activity Manager has already written us off -- now exit.
Process.killProcess(Process.myPid());
System.exit(10);
}

常见错误

官方文件说:

具有优先级错误的 Log.e()日志。但是,具有优先级 ASSERT 的 Log.wtf()日志。

ASSERT 的优先级常数 = 7
ERROR 的优先级常数 = 6

所以 Log.wtf()相对于 Log.e()有更高的优先级

然而,源代码 冲突与上述信息。

static int wtf(int logId, String tag, String msg, Throwable tr,boolean localStack, boolean system) {
        

TerribleFailure what = new TerribleFailure(msg, tr);
// Only mark this as ERROR, do not use ASSERT since that should be
// reserved for cases where the system is guaranteed to abort.
// The onTerribleFailure call does not always cause a crash.
int bytes = printlns(logId, ERROR, tag, msg, localStack ? what : tr);
...
}

看起来官方文档中有一个 错误,因为 Log.wtf()Log.e()的日志都有优先级错误。

真正的区别

Log.e ()的源代码:

public static int e(@Nullable String tag, @Nullable String msg,@Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, ERROR, tag, msg, tr);
}

不同之处在于 Log.wtf ()可能会调用 on 覆盖失败()的回调。

可能会导致进程终止,也可能不会(取决于系统设置)。

DR

Wtf ()可能会调用 onTaibleFalse () ,并可能导致应用程序终止。

我不知道这一点,直到我工作的 ROM 层。

如果设置了某些条件,Log.wtf ()将终止您的进程。我很困惑为什么系统服务一直崩溃。我使用 Log.wtf () ,它因为一些“永远不应该发生的事情”而被解雇