2016-08-24 10 views
6

का उपयोग करके कोई अपवाद नहीं मिला है मेरे पास जावा लाइब्रेरी है जो कार्यों की एक श्रृंखला चलाती है।जावा UncaughtExceptionHandler को जेएनआई

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

UncaughtExceptionHandler UncaughtExceptionHandler लागू करता है और केवल STDERR में त्रुटि जानकारी लॉग इन करें: और मैं एक डिफ़ॉल्ट न आया हुआ अपवाद हैंडलर का उपयोग कर दर्ज किया।

मेरी जावा लाइब्रेरी को सी ++ कोड से जेएनआई के माध्यम से बुलाया जाता है, और जेएनआई इसे ExceptionCheck() के साथ बुला रहा है और त्रुटि को C++ में FATAL के रूप में लॉग करता है।

समस्या है:

क्रम में, जब वहाँ एक RuntimeException (या किसी अन्य न आया हुआ अपवाद) मेरी जावा कोड, त्रुटि सी में कब्जा कर ली ++ में होता है मेरी JavaUncaughtExceptionHandler धागा डिफ़ॉल्ट ध्यान में न आया अपवाद संचालक के रूप में पंजीकृत करने के बजाय ।

  1. क्या यह छोड़कर व्यवहार है?
  2. DefaultUncaughtExceptionHandler वास्तव में कब कॉल किया जाएगा? थ्रेड बंद होने से पहले मुझे पता है, लेकिन जब विशेष रूप से जेएनआई मामले में। क्या इसे सी ++ पर वापस आने से पहले या सी ++ कोड के बाद भी समाप्त किया जाता है)। मुझे लगता है कि यह जेएनआई में थ्रेड प्रबंधन से संबंधित है, कृपया किसी भी संबंधित जानकारी को साझा करें।
  3. वहाँ वैसे भी मैं अपने जावा कोड में सभी अपवाद (एक try/catch ब्लॉक डाल को छोड़कर अन्य वैकल्पिक तरीका)

धन्यवाद इतना पकड़ कर सकते हैं है।

उत्तर

1

ऐसा लगता है जैसे आप जावा प्रार्थना किए एपीआई के बारे में बात कर रहे हैं (के रूप में सरल JNI जहां कॉल अन्य रास्ता तय करने के लिए विरोध यानी, आप एक सी ++ प्रोग्राम के भीतर से जावा तरीकों बुला रहे हैं,।)

मैं मैं एक बड़ा विशेषज्ञ नहीं हूं, लेकिन मैंने जावा आमंत्रण API के साथ काम किया है।

जहां तक ​​मुझे पता है, एक अज्ञात अपवाद हैंडलर केवल तब लागू किया जाएगा जब जावा थ्रेड की run() विधि द्वारा अपवाद फेंक दिया जाता है। लेकिन कोई run() विधि सी/सी ++ कोड द्वारा बनाए गए थ्रेड में विधि नहीं है।

मैं सी, नहीं सी ++, लिखा था तो जावा में मेरी कॉल सभी

jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...); 

की तरह दिखाई देता है कि सी से कहा जाता है, तो वह हमेशा देता है, लेकिन इससे पहले कि आप return_value उपयोग करते हैं, आप विधि जांच करने के लिए है सामान्य रूप से लौटा या अपवाद फेंक दिया।

यदि यह अपवाद फेंक दिया गया है, तो अपवाद के लिए "uncaught" होने का कोई तरीका नहीं है, यदि सी कोड (*env)->ExceptionClear(env) पर कॉल नहीं करता है (यानी, यदि सी कोड अपवाद को "पकड़ नहीं लेता है), तो मैं याद नहीं है कि क्या होता है, लेकिन मुझे नहीं लगता कि यह अच्छा है।

+0

जेम्स, आपकी स्पष्टीकरण के लिए बहुत बहुत धन्यवाद, काफी उपयोगी। हम jenv.checkException (...) विधि का उपयोग कर जावा विधि का आह्वान करते हैं, और अपवाद C++ में कैप्चर किया जाता है। तो मुझे लगता है कि कोड चलाने के लिए सुरक्षित है, लेकिन हम सिर्फ सी के बजाए जावा में सभी अपवाद लॉग करना चाहते हैं। हालांकि, ऐसा लगता है कि इसे UncaughtExceptionHandler द्वारा हासिल नहीं किया जा सकता है। – user788767

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