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

StackOverflow https://stackoverflow.com/questions/2072148

Вопрос

Я читал документы по публикации Android, и они сказали удалить все вызовы журнала из моего кода.У меня есть несколько звонков, чтобы 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 Для вас журнал отладки.d - и который вы можете отключить на базе, если ваше приложение находится в режиме отладки.

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

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

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

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

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

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

:)

Это всего лишь приятное ощущение (стиль).

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

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

Для того, чтобы использовать 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));
 }

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

if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top