यह मेरे लिए बहुत अजीब है। RuntimeException
Exception
से विरासत, जो Throwable
से विरासत में मिलता है।अपवाद कैच रनटाइम अपवाद क्यों नहीं पकड़ रहा है?
catch(Exception exc) { /* won't catch RuntimeException */
लेकिन
catch(Throwable exc) { /* will catch RuntimeException */
मैं जानता हूँ कि RuntimeException
यह अनियंत्रित है कि में विशेष है। लेकिन मेरी समझ के लिए जो अपवादों को घोषित किया जाना है, यह लागू होता है कि वे पकड़े गए हैं या नहीं। और फिर भी, मुझे नहीं पता कि यह तर्क थ्रोबल को पकड़ने पर क्यों टूट जाएगा।
यह मेरे लिए बहुत प्रासंगिक है क्योंकि मेरे पास ऐसी स्थिति है जहां टर्मिनल ऑपरेशन में रनटाइम अपवादों को फेंक दिया जा सकता है। मुझे यकीन नहीं है कि इस पैटर्न के लिए नाम, लेकिन कुछ ऐसा है, मेरी कक्षा EmailRoller
Callbacks
की एक सरणी लेती है। कोड इस तरह दिखता है:
for(Callback cb : callbacks) {
try {
cb.call(item);
}
catch(Exception exc) {
logger.error("Error in callback: ", exc);
}
}
तो यह एक मामले में जहां एक OOME की तरह कुछ, के माध्यम से उड़ान भरने के लिए है क्योंकि अगर इन कॉलबैक में से एक सब मशीन स्मृति की खपत की जरूरत है, यह सुनिश्चित करने के रूप में बिल्ली के संचालन को प्रभावित करने जा रहा है अन्य लोग। लेकिन NullPointerException
? या IndexOutOfBoundsException
? वे कॉलबैक को प्रभावित करेंगे लेकिन दूसरों को दौड़ने से नहीं रोकेगा।
इसके अलावा, यह एक उद्यम डिजाइन का एक सा है। विभिन्न प्रोग्रामर या टीम आइटम को संसाधित करने के लिए कॉलबैक जोड़ सकते हैं, लेकिन उन्हें एक-दूसरे से अलग किया जाना चाहिए। इसका मतलब यह है कि प्रोग्रामर एक दूसरे से इन कॉलबैक को इन्सुलेट करने के लिए ज़िम्मेदार है, इसलिए मुझे यह सुनिश्चित करने के लिए उन पर भरोसा नहीं करना चाहिए कि त्रुटियां फिसलती नहीं हैं। Exception
पकड़ना सही रेखा के बारे में होना चाहिए, लेकिन ऐसा इसलिए नहीं है क्योंकि RuntimeException
के माध्यम से फिसल जाता है। तो मेरा सामान्य सवाल यह है कि यहां एक अच्छा पैटर्न क्या है? बस catch(Exception | RuntimeException exc)
, जो मुझे विश्वास है कि विरासत की वजह से एक वाक्यविन्यास त्रुटि है?
मेरा कोड दोबारा पढ़ें। यह सही है। मेरी इन्सुलेशन परत छोटी थी, क्योंकि रनटाइम अपवाद 'if (results.foo.bar()) से आया था {/ * कॉलबैक लागू करें * /}', जो एक एनपीई था। – djechlin
@ डीजेक्लिन: आपकी पोस्ट * * * नहीं दिखाती है (if. results.foo.bar()) - यह बहुत अस्पष्ट है कि आप वास्तव में इस बिंदु पर क्या पूछ रहे हैं ... –