Android - लॉग करने के लिए पूर्ण अपवाद बैकट्रेस प्रिंट करें


94

मेरे पास एक कोशिश / कैच ब्लॉक है जो एक अपवाद को फेंकता है और मैं एंड्रॉइड डिवाइस लॉग में अपवाद के बारे में जानकारी देखना चाहूंगा।

मैंने अपने विकास कंप्यूटर से इस आदेश के साथ मोबाइल डिवाइस का लॉग पढ़ा:

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

कुछ भी नहीं से बेहतर है, लेकिन बहुत संतोषजनक नहीं है।

क्या आप जानते हैं कि लॉग में पूर्ण बैकट्रेस कैसे प्रिंट किया जाता है?

धन्यवाद।

जवाबों:


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

अधिक स्पष्ट रूप से अधिक जानकारी के साथ

(चूंकि यह इस बारे में सबसे पुराना सवाल है।)

तीन-तर्क वाला एंड्रॉइड लॉग तरीके Exceptionतीसरे पैरामीटर के रूप में प्रदान किए जाने वाले स्टैक ट्रेस को प्रिंट करेगा । उदाहरण के लिए

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

trअपवाद कहां है।

इस टिप्पणी के अनुसार वे लॉग विधियाँ " getStackTraceString()विधि का उपयोग करें ... पर्दे के पीछे" ऐसा करने के लिए।


4
इसके अलावा, मेरी शैली: Log.e (e.getClass ()। GetName (), e.getMessage (), e);
विकास

27
E.getMessage () - getMessage () का उपयोग करने से सावधान रहें, जो फेंके गए अपवाद के प्रकार के आधार पर शून्य हो सकता है, जो अपने आप में एक अपवाद का कारण होगा क्योंकि लॉग विधियों में संदेश पैरामीटर के रूप में नल समर्थित नहीं है। यहां
Uniqe

इसके अलावा, यह वर्णन करने के लिए अधिक समझ में आता है कि दूसरे पैरामीटर में इस अपवाद के कारण किस तरह का कोड है। संदेश पहले से ही आउटपुट में शामिल है।
EboMike

1
@ यूनिक जो कहता है वह बहुत महत्वपूर्ण है। उत्तर में बताए अनुसार लॉग का उपयोग करना बेहतर है क्योंकि यह पहले से ही स्टैक ट्रेस को प्रिंट करता है
बडी

1
@SignoffTeamz आप सिर्फ प्रलेखन पढ़ सकते हैं। यह एक पहचानकर्ता है जो उस लॉग को दिखाता है जो लॉग को फ़िल्टर करना और यह देखना आसान बनाता है कि कौन सा ऐप (और इसका कौन सा हिस्सा) संदेश लिखा है। developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike

52

यह हेल्पर फंक्शन भी अच्छा काम करता है क्योंकि एक्सेप्शन भी थ्रोबेबल है

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

यह एक स्ट्रिंग है जिसका उपयोग ऐप और लोकेशन को निर्दिष्ट करने के लिए किया जाता है। कोई भी तार वहाँ करेगा।
जॉर्ज

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 () इसे मेरे लिए प्रिंट करता है। मुझे नहीं लगता कि आप लॉगकैट को सही तरीके से चला रहे हैं। इसे शेल में न चलाएं, बस चलाएं

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


1

मानक आउटपुट और त्रुटि आउटपुट को डिफ़ॉल्ट रूप से / dev / null को निर्देशित किया जाता है ताकि यह सब खो जाए। यदि आप इस आउटपुट को लॉग इन करना चाहते हैं, तो आपको यहां दिखाए गए निर्देशों को "स्टडआउट और स्टडर" को देखने की आवश्यकता है



0

Android के संदर्भ में, मुझे अपवाद को एक स्ट्रिंग में डालना था:

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));
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.