Log.wtf()与Log.e()有何不同?

gob*_*dor 64 android

我已经看过了android.util.Log的文件,我不知道之间究竟有什么区别Log.e()Log.wtf()是.一个比另一个更受欢迎吗?有功能差异吗?当然,他们并不多余.

未来读者请注意:在提出这个问题的时候,这方面的文件不太清楚.如果您按照上面的链接,他们已经解决了问题.

Joa*_*son 93

严重程度不同;

Log.e() 只会将错误记录到优先级为ERROR的日志中.

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

  • 在WT文件的API文档中已经非常清楚地表明了这一点,在这种情况下是"多么可怕的失败".我无法想象它还能代表什么...... http://developer.android.com/reference/android/util/Log.html (114认同)
  • 它也是一个显然重定向到Google的域名.哈哈 (24认同)
  • 我不知道为什么有人应该把它粘贴在url栏中,但@ chx101做了.(它只显示谷歌风格的404错误) (10认同)
  • 实际上,这个域名没有被谷歌注册,它只显示谷歌404页面.它于2015年7月23日注册(参考:[whois report](https://who.is/whois/log.wtf)) (5认同)
  • 该域名现在指向 [https://www.reddit.com/r/mAndroidDev/](https://www.reddit.com/r/mAndroidDev/) (3认同)

小智 6

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

Log.wtf()(多么可怕的失败)比错误日志更严重.永远不会发生的错误.在终止程序之前,它可能会强制设备保留以写入日志.


Saf*_*dek 6

常见的错误

官方文档说:

Log.e()具有优先级错误的日志。但是,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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

官方文档中似乎有错误。因为两者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);
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于 Log.wtf() 可能会调用 onTerribleFailure() 回调。

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

TL; 博士

Log.wtf() 可能会调用 onTerribleFailure() 并可能导致应用程序终止。


Pau*_*ang 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);

    ...
}
Run Code Online (Sandbox Code Playgroud)

因此,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);
}
Run Code Online (Sandbox Code Playgroud)