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);
Вікас

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

Ця допоміжна функція також чудово працює, оскільки виняток також можна використовувати .

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

Або ... я знаю ... що сказав EboMike.



2

e.printStackTrace () друкує його мені. Я не думаю, що ви правильно запускаєте logcat. Не запускайте його в оболонці, просто запустіть

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


1

Стандартний вихід та вихід помилок за замовчуванням спрямовуються до / dev / null, тому все це втрачено. Якщо ви хочете зареєструвати цей результат, вам слід дотримуватися інструкцій "Перегляд stdout і stderr", показаних тут



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));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.