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.

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.


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

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.


3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}

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


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


1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}

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));
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.