2009-12-02 10 views
5

मान लीजिए कि मेरे पास एक MyException क्लास है जो अपवाद को उप-वर्गीकृत करती है। जब मैं अपने कोड में त्रुटियां उत्पन्न करता हूं तो मैं प्रासंगिक जानकारी को शामिल करने के लिए इस कक्षा का उपयोग कर रहा हूं।क्या इसे फेंकने के बिना अपवाद को तुरंत ठीक करना ठीक है?

मैं आमतौर पर इसे "मानक" अपवाद वर्गों में से एक को लपेटने के लिए उपयोग करता हूं। उदाहरण के लिए, इनपुट सत्यापन के दौरान कोई त्रुटि होता है अगर, मैं की तरह

if (invalidInput()) 
    throw new MyException(new IllegalArgumentException(), arg1, arg2, ...); 

लेकिन मेरे आईडीई (IntelliJ विचार) कुछ करना होगा मुझे चेतावनी दी है कि फेंकने यह बुरा है बिना एक अनियंत्रित अपवाद (इस उदाहरण में IllegalArgumentException) instantiating, लेकिन मुझे नहीं बताता क्यों।

तो इसे फेंकने के बिना अपवाद को तुरंत चालू करना कितना पापी है? मैं नरक के किस सर्कल में जाऊँगा?

+1

इस मामले में आप अवैध अवैधकरण का विस्तार क्यों नहीं करते? – Zed

+0

@Zed क्योंकि मैं व्यावहारिक रूप से सभी अपवादों को लपेटने के लिए MyException का उपयोग करता हूं जिसे मेरे कोड में फेंक दिया जा सकता है। – lindelof

+0

आप सभी जानकारी से छुटकारा पा रहे हैं, 'पकड़' बेकार है ... ब्लीच। :( –

उत्तर

8

आप IllegalArgumentException का एक उदाहरण फेंक, इस मामले में है कि क्या इसके लिए है बेहतर हो सकता है:

if (invalidInput()) 
     new IllegalArgumentException("Invalid argument " + x + ", expected ..."); 

या अन्यथा विस्तार, अवैध अपवाद के बजाय अपवाद, यह अगर आप कस्टम गुणों के साथ इसे बढ़ाना चाहते हैं।

public class MyIllegalArgumentException extends IllegalArgumentException { 
    public MyIllegalArgumentException(Object arg...) { .... } 
} 

दोनों मामले एक दुबला, अधिक सार्थक, वर्ग मॉडल प्रदान करते हैं।

अद्यतन: फेंका अपवाद के साथ प्रासंगिक जानकारी की आपूर्ति के लिए इच्छुक के बारे में अपनी टिप्पणी दी - मानक अपवाद को फेंकने योग्य तर्क के रूप में अपने कस्टम अपवाद वस्तु की आपूर्ति करके आप ऐसा कर सकते contructor यानी यह दौर तो फ्लिप: बजाय अपने अपवाद में प्रासंगिक मानक अपवाद को लपेटने के लिए, आपको प्रासंगिक अपवाद में अपना अपवाद लपेटना चाहिए।

if (invalidInput()) 
     new IllegalArgumentException("Invalid argument " + x + ", expected ...", new MyContextException(a,b,c)); 

(जहां ए, बी & ग आप संचारित करने के लिए चाहते हैं संदर्भ के विभिन्न बिट्स हैं)। इस तरह आप (ओं) कोड में सभी बिंदुओं पर एक सार्थक & उपयुक्त, अपवाद का उपयोग करते हैं, लेकिन आप अपवाद को संभालने/लॉगिंग करते समय प्रासंगिक जानकारी को प्रेषित करते हैं जिसे आप स्टैक को और आगे उपयोग करना चाहते हैं।

+0

@Zed - बस आपकी टिप्पणी के बारे में सभी अपवादों को लपेटना चाहते हैं। ध्यान रखें कि यदि आप ऐसा करते हैं तो आप अपवाद को कड़ी मेहनत कर देंगे और कोड कम पठनीय होगा। मैंने अपने उत्तर को एक वैकल्पिक सुझाव के साथ अपडेट किया जो आपकी आवश्यकताओं के अनुरूप बेहतर हो सकता है। – Joel

2

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

हालांकि, अगर आप RuntimeException उपवर्गीकरण नहीं MyException होने के लिए नरक में जा रहे हैं;)

2

यह बिल्कुल बुरा नहीं है।

अधिकांश चेतावनियों की तरह, वे उन परिस्थितियों को इंगित करने के लिए हैं जो वैध रूप से होने की संभावना कम हैं, क्योंकि वे किसी को गलती से इनकार करते हैं। एसओ पर एक और हालिया उदाहरण स्थानीय चर पर सिंक्रनाइज़ करने के बारे में चेतावनी थी; ऐसा अक्सर नहीं होता है कि आप ऐसा करना चाहते हैं और अनजाने में ऐसा करके समरूपता को गड़बड़ करना आसान है।

इंटेलिजे सिर्फ आपको चेतावनी दे रहा है कि अपवाद आमतौर पर तुरंत फेंकने के लिए बनाए जाते हैं, इसलिए यदि आप ऐसा नहीं कर रहे हैं तो यह ध्वजांकित हो सकता है कि शायद आपका कोड अप्रत्याशित रूप से व्यवहार कर रहा है। आपके मामले में, आप ठीक से कर रहे हैं जो सही है इसलिए चेतावनी को अनदेखा करने के लिए स्वतंत्र महसूस करें। (वास्तव में मेरी परियोजना में संरचना का मतलब है कि मैं अक्सर विभिन्न कारणों से उन्हें फेंक दिए बिना अपवाद बना देता हूं, इसलिए मैंने इंटेलिजे की कॉन्फ़िगरेशन में "जानकारी" स्तर पर चेतावनी को घटा दिया)।

2

यह एक अजीब निर्माण है, लेकिन वहाँ चाल संकलक करने के लिए एक समाधान है।
IAE

private void checkInput() throws IllegalArgumentException { 
     if (...) 
      throw new IllegalArgumentException(); 

फेंकने के लिए अपने invalidInput विधि पुनर्लेखन और:

try { 
     checkInput(); 
    } catch (IllegalArgumentException ex) { 
     throw new MyException(ex, arg1, arg2, ...); 
    } 
1

इंटेलीजे आपको बता क्यों नहीं करता है। आपको बस निरीक्षण के लिए विवरण पढ़ना होगा।

यह निरीक्षण थ्रोबल इंस्टेंटेशन के किसी भी उदाहरण की रिपोर्ट करता है, जहां बनाया गया थ्रोबल वास्तव में कभी नहीं फेंक दिया जाता है। अक्सर यह एक साधारण गलती का परिणाम है।

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