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.