Android - распечатать полную трассировку исключения в журнал

94

У меня есть блок try / catch, который вызывает исключение, и я хотел бы видеть информацию об исключении в журнале устройства Android.

Я прочитал журнал мобильного устройства с помощью этой команды со своего компьютера разработчика:

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

Сначала я попробовал:

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

но это ничего не выводит в журнал. Жаль, потому что это очень помогло бы.

Лучшее, чего я добился:

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

Лучше, чем ничего, но не очень приятно.

Вы знаете, как распечатать полную обратную трассировку в журнал?

Спасибо.

дан
источник

Ответы:

165
try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

Более подробно с дополнительной информацией

(Поскольку это самый старый вопрос по этому поводу.)

Методы журнала Android с тремя аргументами будут печатать трассировку стека для объекта, Exceptionкоторый предоставляется в качестве третьего параметра. Например

Log.d(String tag, String msg, Throwable tr)

где trисключение.

Согласно этому комментарию, эти методы журнала "используют getStackTraceString()метод ... за кулисами" для этого.

ЭбоМайк
источник
4
Кроме того, Мой стиль: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas
27
Остерегайтесь использования e.getMessage () - getMessage () может возвращать значение null, в зависимости от типа возникшего исключения, что само по себе вызовет исключение, поскольку значение null не поддерживается в качестве параметра сообщения в методах журнала. Смотрите здесь
Uniqe
Кроме того, имеет смысл описать, какой код вызвал это исключение во втором параметре. В любом случае сообщение уже включено в вывод.
EboMike
1
То, что говорит @Unique, очень важно. Лучше использовать журнал, как указано в ответе, поскольку он уже печатает трассировку стека
Бадди,
1
@SignoffTeamz Вы могли бы просто прочитать документацию. Это идентификатор, отображающий журнал, который упрощает фильтрацию журнала и просмотр того, какое приложение (и какая его часть) написало сообщение. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike
52

Эта вспомогательная функция также хорошо работает, поскольку Exception также является Throwable .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }
Джордж
источник
Это строка, используемая для указания приложения и местоположения. Здесь подойдет любая строка.
Джордж
8
catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

Или ... я знаю ... что сказал ЭбоМайк.

Марк Сторер
источник
3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}
Варун Нарисетти
источник
2

e.printStackTrace () распечатывает его мне. Я не думаю, что вы правильно используете логарифм. Не запускайте его в оболочке, просто запустите

/home/dan/android-sdk-linux_x86/tools/adb logcat

Фалмарри
источник
1

Стандартный вывод и вывод ошибок по умолчанию направляются в / dev / null, поэтому все они теряются. Если вы хотите записать этот вывод, вам необходимо следовать инструкциям «Просмотр stdout и stderr», показанным здесь.

toc777
источник
1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}
Франк Хоу
источник
0

В контексте Android мне пришлось преобразовать исключение в строку:

try {
    url = new URL(REGISTRATION_PATH);
    urlConnection = (HttpURLConnection) url.openConnection();
} catch(MalformedURLException e) {
    Log.i("MALFORMED URL", String.valueOf(e));
} catch(IOException e) {
    Log.i("IOException", String.valueOf(e));
}
Донато
источник