Android - cetak lacak balik pengecualian penuh untuk log

94

Saya memiliki blok coba / tangkap yang memberikan pengecualian dan saya ingin melihat informasi tentang pengecualian tersebut di log perangkat Android.

Saya membaca log perangkat seluler dengan perintah ini dari komputer pengembangan saya:

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

Saya mencoba ini dulu:

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

tapi itu tidak mencetak apa pun ke log. Sayang sekali karena itu akan banyak membantu.

Yang terbaik yang pernah saya raih adalah:

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

Lebih baik daripada tidak sama sekali tapi tidak terlalu memuaskan.

Apakah Anda tahu cara mencetak lacak balik lengkap ke log?

Terima kasih.

dan
sumber

Jawaban:

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

Lebih Eksplisit dengan Info Lebih Lanjut

(Karena ini adalah pertanyaan tertua tentang ini.)

Metode log Android tiga argumen akan mencetak pelacakan tumpukan untuk Exceptionyang disediakan sebagai parameter ketiga. Sebagai contoh

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

di mana trPengecualiannya.

Menurut komentar ini, metode Log tersebut "menggunakan getStackTraceString()metode ... di balik layar" untuk melakukan itu.

EboMike
sumber
4
Selain itu, Gaya saya: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas
27
Hati-hati menggunakan e.getMessage () - getMessage () dapat mengembalikan null, bergantung pada jenis pengecualian yang telah dilemparkan, yang dengan sendirinya akan menyebabkan pengecualian karena null tidak didukung sebagai parameter pesan dalam metode Log. Lihat di sini
Uniqe
Selain itu, lebih masuk akal untuk menjelaskan jenis kode apa yang menyebabkan pengecualian ini di parameter kedua. Pesan tersebut sudah termasuk dalam keluaran.
EboMike
1
Apa yang dikatakan @Unique sangat penting. Lebih baik menggunakan Log seperti yang disebutkan dalam jawaban karena sudah mencetak jejak tumpukan
Sobat
1
@SignoffTeamz Anda cukup membaca dokumentasi. Ini adalah pengenal yang menampilkan log yang memudahkan Anda memfilter log dan melihat aplikasi mana (dan bagian mana) yang menulis pesan. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike
52

Fungsi helper ini juga berfungsi dengan baik karena Exception juga dapat dilempar .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }
George
sumber
Ini adalah string yang digunakan untuk menentukan aplikasi dan lokasi. String apa pun bisa digunakan di sana.
George
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() );
}

Atau ... ya tahu ... apa yang dikatakan EboMike.

Mark Storer
sumber
3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}
Varun Narisetty
sumber
2

e.printStackTrace () mencetaknya untuk saya. Saya tidak berpikir Anda menjalankan logcat dengan benar. Jangan menjalankannya di shell, jalankan saja

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

Falmarri
sumber
1

Output standar dan output kesalahan diarahkan ke / dev / null secara default sehingga semuanya hilang. Jika Anda ingin mencatat keluaran ini maka Anda harus mengikuti instruksi "Melihat stdout dan stderr" yang ditunjukkan di sini

toc777
sumber
1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}
Frank Hou
sumber
0

Dalam konteks Android, saya harus mentransmisikan Exception ke String:

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));
}
Donato
sumber