Android - günlüğe tam istisna geri izleme yazdırın


94

Bir istisna atan bir dene / yakala bloğum var ve Android cihaz günlüğünde istisna hakkındaki bilgileri görmek istiyorum.

Mobil cihazın günlüğünü geliştirme bilgisayarımdan şu komutla okudum:

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

Önce bunu denedim:

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

ancak bu, günlüğe hiçbir şey yazdırmaz. Yazık çünkü çok yardımcı olabilirdi.

Elde ettiğim en iyi şey:

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

Hiç yoktan iyidir ama pek tatmin edici değil.

Tam geri izlemeyi günlüğe nasıl yazdıracağınızı biliyor musunuz?

Teşekkürler.

Yanıtlar:


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

Daha Fazla Bilgiyle Daha Açıkça

(Bu, bununla ilgili en eski soru olduğu için.)

Üç bağımsız değişkenli Android günlük yöntemleri Exception, üçüncü parametre olarak sağlanan bir öğenin yığın izlemesini yazdırır . Örneğin

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

trİstisna nerede .

Bu yoruma göre, bu Log yöntemleri getStackTraceString()bunu yapmak için "perde arkasında ... yöntemi kullanırlar ".


4
Ek olarak, Benim tarzım: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas

27
E.getMessage () kullanmaya dikkat edin - getMessage (), atılan istisna türüne bağlı olarak null döndürebilir ve bu da Log yöntemlerinde ileti parametresi olarak null desteklenmediği için bir istisnaya neden olur. Burada
Uniqe

Ayrıca ikinci parametrede bu istisnaya ne tür bir kodun neden olduğunu açıklamak daha mantıklıdır. Mesaj zaten çıktıya dahil edilmiştir.
EboMike

1
@Unique'in söylediği çok önemli. Yığın izini zaten yazdırdığı için yanıtta belirtildiği gibi Günlüğü kullanmak daha iyidir
Buddy

1
@SignoffTeamz Belgeleri okuyabilirsiniz. Günlüğü filtrelemenizi ve hangi uygulamanın (ve hangi kısmının) mesajı yazdığını görmenizi kolaylaştıran günlüğü gösteren bir tanımlayıcıdır. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike

52

Bu yardımcı işlev , Exception da Throwable olduğu için iyi çalışır .

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

Uygulamayı ve konumu belirtmek için kullanılan bir dizedir. Herhangi bir dizge orada işe yarar.
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() );
}

Ya da ... bilirsin ... EboMike ne dedi.


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

2

e.printStackTrace () bunu bana yazdırır. Logcat'i doğru çalıştırdığını sanmıyorum. Bir kabukta koşma, sadece koş

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


1

Standart çıktı ve hata çıktısı varsayılan olarak / dev / null'a yönlendirilir, bu yüzden hepsi kaybolur. Bu çıktıyı günlüğe kaydetmek istiyorsanız, burada gösterilen "stdout ve stderr görüntüleme" talimatlarını izlemeniz gerekir.


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

0

Android bağlamında, İstisnayı bir String'e dönüştürmek zorunda kaldım:

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));
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.