How does Log.wtf() differ from Log.e()?
我看过android.util.Log的文档,但我不确定
给以后的读者的注意:在问这个问题时,有关此问题的文档还不清楚。如果您点击上面的链接,他们已经解决了问题。
严重程度有所不同;
常见的错误
官方文档说:
ASSERT的优先级常数= 7
ERROR的优先级常数= 6
因此,相对于
,
但是源代码与以上信息冲突。
1 2 3 4 5 6 7 8 9 | 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.e()的源代码:
1 2 3 | 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()可能会或可能不会导致进程终止(取决于系统设置)。
TL; DR
Log.wtf()可能会调用onTerribleFailure()并可能导致应用程序终止。
实际上,这可能是Android SDK中的文档错误,这真是令人惊讶... Doc说:
The error will always be logged at level ASSERT with the call stack.
但是源代码是这样的:
1 2 3 4 5 6 7 8 | 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()可能会使您的应用程序崩溃。
下面是一个代码段:
1 2 3 4 5 6 7 | 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.i用于获取有关发生位置的信息。 log.e用于可能发生的错误。 log.wtf用于永远不会发生的错误。我认为这只是一种便利,因此您不需要Log(" ERROR:"," an error")和Log(" INFO:"," information")
我认为wtf(严重失败)用于报告应用程序的严重异常/问题(例如,在调试控制台中报告它们)。
log.e用于报告错误,但没有那么严重。
直到我从事ROM层的工作,我才知道这一点。
如果设置了某些条件,
Log.wtf()将终止您的进程。我对为什么系统服务一直崩溃感到非常困惑。那是我使用了Log.wtf(),并且因为某些"本不应该发生的事情"而被解雇了