Подтвердить что ты не робот

Должен ли я удалить e.printStackTrace() из моего кода перед публикацией

Я читал документы Android Publishing, и они сказали удалить все вызовы журнала из моего кода. У меня есть некоторые вызовы e.printStackTrace() в моем коде, которые могут быть напечатаны как часть обычного запуска моей программы (т.е. Если файл еще не существует).

Должен ли я также удалить эти вызовы?

4b9b3361

Ответ 1

Вы не должны использовать 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] вызовов из вашего кода.

Ответ 2

Если вы разрешаете Exception распространяться до ОС, то ОС будет регистрировать ее, а также всплывать окно Force Close, убивая ваше приложение. Если вы поймаете это, вы можете предотвратить закрытие приложения.

Если вы хотите, чтобы ваши пользователи имели возможность отправлять вам ошибки, которые они получают, я бы зарегистрировал трассировку стека. Затем они могут отправить вам журнал через приложение, например Log Collector.

Если вы хотите избежать возможности подвергать свою трассировку вашей информации трассировки вашим пользователям, тогда поймайте исключение и не запишите его.

Ответ 3

Я бы использовал класс журнала для вывода сообщения. Для журналов, которые, по вашему мнению, важны для пребывания в приложении, используйте Log.i для предупреждения об ошибках - Log.e Log.w Для вас debug Log.d - и вы можете отключить его, если ваше приложение находится в режиме отладки.

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

Ответ 4

Хорошо printStackTrace() будет записывать его в ОС, заставляя приложение andorid (или компьютер) прекратить (принудительно закрыть) вместо этого сделать что-то вроде этого:

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

Ответ 5

в моем скромном мнении (я не разработчик Android)

Это должно быть хорошо. Я не знаю параметры ведения журнала для Android, но я уверен, что у вас есть настраиваемая вещь для вывода (или нет) ваших трасс.

И если вы не сделаете printStackTrace(), Android не будет выполнять грязную работу, игнорируя его.

:)

Это только вещь хорошего настроения (стиля).

Ответ 6

Если вы хотите быть в безопасности, то есть не позволяйте никому отслеживать чтение журналов исключений, вы можете сделать что-то вроде

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

Ответ 7

Чтобы использовать 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));
 }

Ответ 8

Используйте это, чтобы удалить журналы из версии apk

if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");