Android - พิมพ์ backtrace ข้อยกเว้นทั้งหมดเพื่อบันทึก


96

ฉันมีบล็อก 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());
}

ดีกว่าไม่มีอะไร แต่ไม่พอใจมาก

คุณรู้วิธีพิมพ์ backtrace แบบเต็มลงในบันทึกหรือไม่?

ขอบคุณ.

คำตอบ:


166
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เป็นข้อยกเว้น

ตามความเห็นนี้วิธี Log เหล่านั้น "ใช้getStackTraceString()วิธี ... เบื้องหลัง" เพื่อทำเช่นนั้น


4
นอกจากนี้สไตล์ของฉัน: Log.e (e.getClass (). getName (), e.getMessage (), e);
Vikas

27
ระวังการใช้ e.getMessage () - getMessage () อาจส่งคืนค่าว่างขึ้นอยู่กับชนิดของข้อยกเว้นที่ถูกโยนซึ่งจะทำให้เกิดข้อยกเว้นเนื่องจากค่า null ไม่ได้รับการสนับสนุนเป็นพารามิเตอร์ข้อความในเมธอด Log ดูที่นี่
Uniqe

นอกจากนี้ควรอธิบายว่าโค้ดประเภทใดที่ทำให้เกิดข้อยกเว้นนี้ในพารามิเตอร์ที่สอง ข้อความจะรวมอยู่ในผลลัพธ์แล้ว
EboMike

1
สิ่งที่ @Unique บอกว่าสำคัญมาก จะดีกว่าถ้าใช้ Log ตามที่กล่าวไว้ในคำตอบเนื่องจากมันพิมพ์ stack trace ไปแล้ว
Buddy

1
@SignoffTeamz คุณสามารถอ่านเอกสาร เป็นตัวระบุที่แสดงบันทึกที่ช่วยให้คุณกรองบันทึกได้ง่ายขึ้นและดูว่าแอปใด (และส่วนใดของบันทึก) เขียนข้อความ developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike

53

ฟังก์ชั่นช่วยนี้ยังใช้งานได้ดีตั้งแต่ข้อยกเว้นยังเป็นThrowable

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }

เป็นสตริงที่ใช้ระบุแอปและตำแหน่ง สตริงใด ๆ จะทำที่นั่น
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() );
}

หรือ ... รู้ ... สิ่งที่ EboMike พูด



2

e.printStackTrace () พิมพ์มาให้ฉัน ฉันคิดว่าคุณใช้ Logcat ไม่ถูกต้อง อย่าใช้มันในเปลือกเพียงแค่เรียกใช้

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


1

เอาต์พุตมาตรฐานและเอาต์พุตข้อผิดพลาดถูกนำไปที่ / dev / null ตามค่าเริ่มต้นดังนั้นจึงสูญหายทั้งหมด หากคุณต้องการบันทึกผลลัพธ์นี้คุณต้องทำตามคำแนะนำ "การดู stdout และ stderr" ที่แสดงไว้ที่นี่



0

ในบริบทของ Android ฉันต้องส่ง Exception เป็น 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));
}

0

โซลูชัน KOTLIN:

คุณสามารถใช้ฟังก์ชันตัวช่วยgetStackTraceString()ที่เป็นของandroid.util.Logคลาสเพื่อพิมพ์ข้อความแสดงข้อผิดพลาดทั้งหมดบนคอนโซล

ตัวอย่าง:

try { 
 
   // your code here
    
} catch (e: Exception) {

     Log.e("TAG", "Exception occurred, stack trace: " + e.getStackTraceString());

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.