web-dev-qa-db-ja.com

パブリッシュする前にコードからe.printStackTrace()を削除する必要がありますか

Android Publishing docsを読んでいて、コードからすべてのLog呼び出しを削除するように言われました。コード内にe.printStackTrace()への呼び出しがあり、一部として印刷できます私のプログラムの通常の実行の(すなわち、ファイルがまだ存在しない場合)。

これらの通話も削除する必要がありますか?

41
jax

とにかくe.printStackTrace()を直接使用するべきではありません。そうすると、情報がAndroidログに送信され、どのアプリケーション(ログタグ)か)が表示されません。

他の人が述べたように、問題のExceptionを引き続きキャッチしますが、Android.util.Logメソッドの1つを使用してロギングを行います。スタックトレースではなくメッセージのみをログに記録するか、スタックトレースに詳細ログを使用できます。

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]呼び出しを削除する をコードから削除することです。

46
Christopher Orr

例外がOSまで伝播することを許可すると、OSはそれをログに記録し、[強制終了]ウィンドウをポップアップして、アプリケーションを強制終了します。キャッチした場合、アプリケーションが強制的にクローズされるのを防ぐことができます。

ユーザーが取得したエラーをユーザーに送信できるようにしたい場合は、スタックトレースをログに記録します。その後、 Log Collector のようなアプリを介してログを送信できます。

スタックトレース情報をユーザーに公開する可能性を避けたい場合は、例外をキャッチしてログに記録しないでください。

3
Mark B

メッセージの出力にはLogクラスを使用します。アプリに留まることが重要だと思われるログの場合-エラーの警告にはLog.iを使用します-Log.e Log.w Log.dをデバッグするには-アプリケーションがデバッグモードの場合は、基本的にオフにすることができます。

http://developer.Android.com/reference/Android/util/DebugUtils.html

2
Alex Volovoy

まあprintStackTrace()はOSにログを記録し、Android(またはコンピューター)アプリを終了(強制終了)します。代わりに、次のようにします。

public void nullPointerExceptionCauser()
{
      try
      {
           Object example = null;
           example.toString();
      }
      catch (Exception e)
      {
           Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace());
      }
}
1
Brandon

控えめな意見ですが(Android開発者)ではありません)

いいはずです。 Androidのログオプションはわかりませんが、トレースを出力する(または出力しない)ための構成可能なものがあると確信しています。

そして、もしあなたがprintStackTrace()を行わなければ、Androidはそれを無視するという汚い仕事をしません。

:)

それは気持ちの良い(スタイルの)ものだけです。

0
helios

より安全な方法でprintStackTraceを使用するには、StringWritePrintWriterを使用します。

    ...
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));
 }
0
Ayaz Alifov

安全にしたい場合、つまりスヌーピングに例外ログの読み取りを許可しない場合は、次のようなことができます

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"));
              }
          });
    }
}
0
Dori