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

91
我查看了android.util.Log的文档,但不确定`Log.e()`和`Log.wtf()`之间的区别。其中一个是否比另一个更受欢迎?它们之间是否有功能差异?它们肯定不是冗余的。 注:对于未来的读者:在提出这个问题时,此项文档的说明要少得多。如果您按上面的链接,他们已经解决了这个问题。

12
似乎只是严重程度的不同。Wtf代表这是一个永远不应该发生的错误。 - Mike Christensen
最佳答案有误,请查看我的回答:https://dev59.com/lGkw5IYBdhLWcg3w_PXn#47314146 - Safak Ozdek
7个回答

120

两者的严重性不同;

Log.e()仅会使用优先级ERROR将错误记录到日志中。

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


152
API文档清楚地表明,在这种情况下,WTF代表“多么可怕的失败”。我想不到它可能代表什么其他意思... http://developer.android.com/reference/android/util/Log.html - Carlos P
26
这个域名似乎会重定向到谷歌。哈哈。 - TheRealChx101
11
我不知道为什么有人会把这个粘贴到网址栏中,但是@chx101却这样做了。(只会显示一个类似谷歌风格的404错误页面) - MrWasdennnoch
5
实际上,这个域名并没有被谷歌注册,它只显示了谷歌的404页面。它是在2015年7月23日注册的(参考:whois报告)。 - MrWasdennnoch
7
该域名现在指向https://www.reddit.com/r/mAndroidDev/。 - Ashutosh Singh

14

TL;DR

Log.wtf()的优先级高于Log.e(),但它可能会调用onTerribleFailure()并导致应用程序终止。

常见错误

官方文档说:

Log.e()使用优先级ERROR进行日志记录。然而,Log.wtf()使用优先级ASSERT进行日志记录。

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()都使用ERROR优先级进行日志记录。

真正的区别

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()可能会调用onTerribleFailure()回调函数。

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


8

Log.e() 是将错误信息记录在日志中,并将其优先级设置为 ERROR。

Log.wtf()(表示“真是一个可怕的失败”)比错误日志更严重。它是一种从未发生过的错误,可能会强制设备在终止程序之前保留写入日志。


5

实际上,这可能是Android SDK中的文档错误,真是惊人...文档说:

错误将始终以调用堆栈为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()调用onTerribleFailure()回调函数,“报告当前进程中的严重错误。可能会导致进程终止(取决于系统设置)。”

换句话说,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);
}

@AlicanŞafakÖzdek 你能补充一下为什么吗? - xuiqzy

1

我认为wtf(what a terrible failure)用于报告应用程序的严重异常/问题(例如,在调试控制台中报告它们)。

log.e用于报告错误,但不是那么严重。


1
与其他日志类型一样,我认为它只是用于日志消息的另一种标签类型。log.i 用于有关某个事件发生位置的信息。log.e 用于可能发生的错误。log.wtf 用于从未发生的错误。我认为这只是一种方便,这样你就不必像 Log("ERROR:", "an error") 和 Log("INFO: ", "information") 这样写了。

在专业领域中,永远不应该存在从未发生过的错误这种事情。每一种错误可能性都应该至少被记录并计划处理。 - user1499731
4
如果我们能够计划并准备好每一个可能性,那么我们就不需要任何错误信息了。 - forresthopkinsa

0

在我开始从事ROM层工作之前,我并不知道这一点。

如果设置了某些条件,Log.wtf()将终止您的进程。我曾经非常困惑为什么系统服务总是崩溃。原来是因为我使用了Log.wtf(),它会因为某些“永远不应该发生”的事情而被触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接