मैं पहले अपने उपयोग के मामले में प्रश्न को जल्दी से प्रेरित कर दूंगा। मेरी लाइब्रेरी को एक जावा अपवाद वर्गीकरण को उस ढांचे में बेनकाब करने की आवश्यकता है, जिसमें यह प्लग इन है। उदाहरण के लिए:जंजीर अपवादों में चक्र
enum Classification { FATAL, TRANSIENT, UNKNOWN }
Classification classify(Throwable t) {
if (t instanceof MyTransientException)
return Classification.TRANSIENT;
else if (t instanceof MyFatalException)
return Classification.FATAL;
else
return Classification.UNKNOWN;
}
कभी कभी, और मेरे नियंत्रण से बाहर कारणों के लिए, पारित कर दिया अपवाद एक मैं में तो मैं इसके लिए कारण श्रृंखला खोज करना चाहते हैं इच्छुक हूँ चारों ओर एक आवरण है। मेरे प्रारंभिक विचार था: यदि पारित कर दिया अपवाद इसके कारण श्रृंखला में एक चक्र है
Classification classify(Throwable t) {
if (t == null)
return Classification.UNKNOWN;
if (t instanceof MyTransientException)
return Classification.TRANSIENT;
else if (t instanceof MyFatalException)
return Classification.FATAL;
else
return classify(t.getCause());
}
दुर्भाग्य से, इस अनंत प्रत्यावर्तन हो सकती थी। यह बेहद असंभव है कि ऐसा अपवाद पारित किया जाएगा, और एक तर्क दिया जा सकता है कि अगर ऐसा अपवाद बनाया गया है तो यह सिस्टम में कहीं और त्रुटि है, लेकिन मुझे उत्पादन के लिए ज़िम्मेदार होने की संभावना रखने में मुझे बहुत असहज है अगर ऐसा होता है तो आउटेज। थ्रोवेबल एपीआई और जावाडोक इस संभावना से परे इस संभावना को स्पष्ट रूप से मना नहीं करते हैं कि चक्र एक कारण श्रृंखला में स्वाभाविक रूप से गैर-मानसिक हैं।
मैंने देखा कि गुवा के पास कारण श्रृंखला, Throwables.getCausalChain निकालने के लिए @ बीटा विधि है, लेकिन इसका कार्यान्वयन एक ही मुद्दे के लिए अतिसंवेदनशील है - यह एक ओओएमई फेंकने में हवा देगा।
मैं चक्र का पता लगाने और जोखिम को कम करने के लिए identity hash set का उपयोग करने की योजना बना रहा हूं, लेकिन मैं यह सुनना चाहता था कि अन्य लोग इस मुद्दे को कैसे देखते हैं। क्या आपको लगता है कि मैं अत्यधिक रक्षात्मक हूं? तुम क्या करोगे?