我正在阅读Android出版文档,他们建议从我的代码中删除所有的 Log 调用。 我的代码中有一些调用 e.printStackTrace()
,这些调用可以作为程序正常运行的一部分进行打印(例如,如果文件尚不存在)。
我是否也应该删除这些调用呢?
我正在阅读Android出版文档,他们建议从我的代码中删除所有的 Log 调用。 我的代码中有一些调用 e.printStackTrace()
,这些调用可以作为程序正常运行的一部分进行打印(例如,如果文件尚不存在)。
我是否也应该删除这些调用呢?
您不应该直接使用e.printStackTrace()
,这样会将信息发送到Android日志中而不显示来自哪个应用程序(日志标记)。
正如其他人所提到的那样,继续捕获相关的Exception
,但使用其中一个android.util.Log
方法来记录。 您可以仅记录消息而不是堆栈跟踪,或者使用详细记录来记录堆栈跟踪:
try {
Object foo = null;
foo.toString();
} catch (NullPointerException ex) {
Log.w(LOG_TAG, "Foo didn't work: "+ ex.getMessage());
Log.d(LOG_TAG, Util.stackTraceWriter(ex));
}
您应该从生产版本中剥离DEBUG
或VERBOSE
的日志信息。最简单的方法是使用ProGuard来删除代码中的Log.[dv]
调用。
我会使用Log类进行消息输出。对于你认为在应用程序中很重要的日志,使用Log.i;对于错误警告,使用Log.e或Log.w。对于你的调试信息,使用Log.d,并且可以根据应用程序是否处于调试模式来关闭。
http://developer.android.com/reference/android/util/DebugUtils.html
好的,printStackTrace()
会将其记录到操作系统中,导致您的安卓(或计算机)应用程序终止(强制关闭),因此,请尝试像这样做:
public void nullPointerExceptionCauser()
{
try
{
Object example = null;
example.toString();
}
catch (Exception e)
{
Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace());
}
}
private void hideExceptionsInReleaseMode()
{
final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
if(!BuildConfig.DEBUG)
{
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
defaultHandler.uncaughtException(thread, new RuntimeException("Something went wrong :p"));
}
});
}
}
在我谦虚的意见中(我不是Android开发者)
这应该很好。我不知道Android的日志选项,但我相信你有一些可配置的东西来输出(或不输出)你的跟踪信息。
如果你不使用printStackTrace(),Android就不会忽略它而不做任何处理。
:)
这只是一种好感(风格)的事情。
printStackTrace
,我会使用StringWrite
和PrintWriter
: ...
catch (final Exception e)
{
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
Log.e("TAG", sw.toString());
}
或者,另外一种选择是:
catch (final Exception e)
{
Log.e(TAG, Log.getStackTraceString(e));
}
if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");
Util.stackTraceWriter
已经不存在了。无论如何,可以使用Log.getStackTraceString
来代替。 - superjos