6

बदले बिना handleUncaughtException ओवरराइड करने के लिए मैं this सवाल कुछ समय Stackoverflow पर वापस पूछा, जवाब मेरे लिए काम किया, यह handleUncaughtException ओवरराइड करता है, मैं अपवाद बचाने के लिए और डिफ़ॉल्ट Unfortunately app has stopped working फेंकता है, लेकिन जब मैं अपने अनुप्रयोग में इस एकीकृत , मुझे एक समस्या का सामना करना पड़ रहा है।कैसे अपने functionallity

यह वह जवाब है जो मुझे मिला।

private Thread.UncaughtExceptionHandler defaultExceptionHandler; 

    public void registerCrash(){ 
     defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); 

     Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler(){ 
      @Override 
      public void uncaughtException (Thread thread, Throwable e){ 
       handleUncaughtException (thread, e); 
       if(defaultExceptionHandler != null){ 
        defaultExceptionHandler.uncaughtException(thread, e); 
       } 
      } 
     }); 
    } 

यह क्या करता है, पहले यह handleUncaughtException (thread, e); मैं इस विधि में क्रैश लॉग को बचाने के लिए चला जाता है, तो यह इस लाइन पढ़ता

if(defaultExceptionHandler != null){ 
    defaultExceptionHandler.uncaughtException(thread, e); 
} 
यहाँ

हम न आया हुआ अपवाद फिर से है, तो यह जाता है पहले करने के लिए फेंक लाइन फिर से, और फिर अपवाद बचाता है, और यह लूप में चला जाता है, और एप्लिकेशन प्रतिक्रिया नहीं दे रहा है।

जो मैं चाहता हूं वह क्रैश लॉग को सहेजना है, और फिर उपयोगकर्ता को डिफ़ॉल्ट Unfortunate संदेश दिखाएं।

संपादित

ऐप्स लॉन्च पर यह इस पढ़ता है;

defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); 

अनुप्रयोग क्रैश हो जाता है, यह इन पंक्तियों

Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler(){ 
    @Override 
    public void uncaughtException (Thread thread, Throwable e){ 

     handleUncaughtException (thread, e); //Custom Method 

     if(defaultExceptionHandler != null){ 
      defaultExceptionHandler.uncaughtException(thread, e); 
     } 
    } 

पढ़ता है तो यह पहले handleUncaughtException() वहाँ मैं कस्टम कार्यान्वयन प्रदान की है करने के लिए हो जाता है, तो यह इस करने के लिए चला जाता है,

if(defaultExceptionHandler != null){ 
    defaultExceptionHandler.uncaughtException(thread, e); 
} 

defaultExceptionHandler कभी शून्य नहीं है; तो यह कई दुर्घटनाओं के मामले में एक पाश में चला जाता है।

मैंने वहां count जोड़ने का प्रयास किया है, लेकिन यह हर बार 0 था।

+0

'तो यह कई के मामले में एक पाश में चला जाता है दुर्घटनाओं 'क्या आप एक परिदृश्य को इंगित कर सकते हैं? क्या होने का एक और अपवाद होता है? – azizbekian

+0

@azizbekian: मैं इसके पुनर्निर्माण के लिए कदमों को खोजने में असमर्थ था। यह हर बार नहीं होता है, लेकिन कभी-कभी – Kirmani88

+0

डिफ़ॉल्ट अपवाद हैडलर विधि क्या है। क्या यह आपकी खुद की विधि है? यदि हां उस विधि कोड को पोस्ट करें। और पोस्ट हैंडल UncaughtException (थ्रेड, ई) विधि कोड भी –

उत्तर

1

सबसे अधिक संभावना स्पष्टीकरण यह है कि आपकी registerCrash() विधि को दो बार बुलाया जा रहा है।

पहली बार, आप Handler 1 पंजीकृत करते हैं; इस बिंदु पर कोई डिफ़ॉल्ट हैंडलर नहीं है, इसलिए यह defaultExceptionHandler से null पर सेट करता है। दूसरी बार, आप Handler 2 पंजीकृत करते हैं, और फिर Handler 1 पर इंगित करने के लिए defaultExceptionHandler अपडेट करें।

एक बेजोड़ अपवाद पर, Handler 2 पहले आक्रमण किया जाता है। यह आपके कस्टम हैंडलर विधि को कॉल करता है, फिर defaultExceptionHandler को आमंत्रित करता है, जो अब Handler 1 पर इंगित करता है।

Handler 1 आक्रमण किया जाता है। यह आपकी कस्टम हैंडलर विधि को दूसरी बार कॉल करता है, फिर यह defaultExceptionHandler, को आमंत्रित करता है जो अब को इंगित करता है। यह चरण तब तक दोहराता है जब तक आपका ढेर बहती न हो।

मैं दो परिवर्तनों का सुझाव देता हूं। सबसे पहले, यह सुनिश्चित करने के लिए एक गार्ड जोड़ें कि आप केवल एक बार अपने क्रैश हैंडलर को पंजीकृत करें। दूसरा, किसी क्षेत्र में फ़ॉलबैक हैंडलर को स्टोर न करें; इसे बंद करने में कैप्चर करें ताकि आपके हैंडलर द्वारा देखा गया मान कभी भी न बदल जाए।

private static final AtomicBoolean CRASH_HANDLER_REGISTERED = new AtomicBoolean(); 

public void registerCrash() { 
    if (CRASH_HANDLER_REGISTERED.compareAndSet(false, true)) { 
     final Thread.UncaughtExceptionHandler defaultHandler = 
      Thread.getDefaultUncaughtExceptionHandler(); 

     Thread.setDefaultUncaughtExceptionHandler(
      new Thread.UncaughtExceptionHandler() { 
       @Override 
       public void uncaughtException(Thread thread, Throwable e) { 
        handleUncaughtException(thread, e); // Custom Method 

        if (defaultHandler != null) { 
         defaultHandler.uncaughtException(thread, e); 
        } 
       } 
      } 
     ); 
    } 
} 
0

मैं यदि आप किसी अन्य तरीके का प्रयास करें के लिए अपवाद अधिभावी से बचने के लिए उसे पकड़ने और त्रुटि कोड पुनर्प्राप्त, और ऐसा करने का सुझाव देते हैं:

when x code with x conditions verify, do that

संबंधित मुद्दे