2012-07-02 6 views
16

कभी कभी, मैं ऐसे यहाँ के रूप मेंआप जावा में "असंभव" अपवाद कैसे संभालते हैं?</p> <pre><code>public void methodWithURL(URL url){ URI uri = new URI(url); //No invalud URI syntax possible } </code></pre> <p>आप इससे कैसे निपटेंगे:

URLDecoder.decode("some string", "UTF-8"); //No unknown encoding possible 

या यहां, एक अपवाद मुझे पता है कि ऐसा कभी नहीं कर सकते हैं पकड़ने के लिए होने अंत करेंगे? मैं आमतौर पर ब्रह्मांड के नियमों को बदलने के तरीके के बारे में एक अजीब त्रुटि लॉग करता हूं, और फिर RuntimeException फेंक देता हूं। क्या कोई बेहतर तरीका है?

+3

कोशिश करें/पकड़ें (XXXException _ex) {नया AssertionError (_ex) फेंकें;} – bestsss

+0

@bestsss मैंने RuntimeException के विकल्प के रूप में AssertionError के बारे में भी सुना है। क्या यह RuntimeException पर ऐसा करने का सामान्य तरीका है, या इस प्रकार की त्रुटियों को उप-वर्गीकृत करने का एक बेहतर तरीका है? धन्यवाद! (भी, आप उत्तर अनुभाग में लिखना चाहेंगे) – Miquel

+1

त्रुटि अपवाद का विस्तार नहीं करती है, इसलिए यह अत्यधिक उपयोग की कोशिश/पकड़ (अपवाद किसी भी) को छोड़ देता है। जो कुछ भी 'थ्रोबल' पकड़ता है वह स्पष्ट रूप से w/'त्रुटि 'को सौदा करेगा। ग्राहक कोड को किसी भी कारण से 'त्रुटि' नहीं पकड़ेगा। पूरी तरह से लॉग अप अपवाद है कि * नहीं होगा * आमतौर पर करने के लिए सही बात नहीं है। और, नहीं, मैं जवाब का प्रयास नहीं करना चाहता हूं :) – bestsss

उत्तर

9

मैं Exception पकड़ता हूं और इसे Error में लपेटता हूं। Error के दस्तावेज़ से:

कोई त्रुटि है कि गंभीर समस्याओं को इंगित करता है फेंकने योग्य का एक उपवर्ग है कि एक उचित आवेदन को पकड़ने की कोशिश नहीं करनी चाहिए।

+0

धन्यवाद बहुत जूलियन। अब मैं आश्वस्त हूं कि 'त्रुटि' व्युत्पन्न करना सबसे अच्छा तरीका है। @bestsss ने प्रश्न के टिप्पणी खंड में कुछ सुझाव भी दिए, जिसमें AssertionError – Miquel

+0

+1 का उपयोग शामिल है _this_ वास्तव में एक ठोस जवाब है। यह 'AssertionError'' जैसा विशिष्ट नहीं है (जो 'assert' कथन की अनुपस्थिति में अजीब लग सकता है) और' RuntimeException' के समान प्रभाव पड़ता है। इसके अलावा यह कोड के तर्क के बजाय "सिस्टम" के साथ एक परेशानी का संकेत है। पसंद। मुझे आश्चर्य है कि क्या यह दृष्टिकोण व्यापक रूप से ज्ञात है या नहीं, या यदि कोई डाउनसाइड्स हैं? –

+1

* इसके अलावा यह "सिस्टम" * के साथ एक समस्या का संकेत देता है * यह 'आंतरिक त्रुटि' है। मैं इसे 1.1 में उपयोग करता था लेकिन 1.4 में 'एसेटियन एरर' पर स्विच करता था (एक सी-टोर डब्ल्यू/थ्रोवेबल भी प्रदान करता है)। इसके अलावा कुछ त्रुटियां सिस्टम त्रुटि का बिल्कुल परिणाम नहीं हो सकती हैं लेकिन प्रोग्रामिंग वाले या डेटर्स हैं। बीटीडब्ल्यू, जावा उपयोग में कुछ स्थान 'System.exit (-1) ' – bestsss

3

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

कई स्टाइल गाइड असंभव अपवादों के लिए सुझाव देते हैं। आप willNeverHappen नामक अपवाद पैरामीटर के साथ एक खाली पकड़ ब्लॉक का उपयोग कर सकते हैं; आप खाली ब्लॉक में एक टिप्पणी कर सकते हैं;

आप सुपर महत्वाकांक्षी होना चाहते हैं, तो आप एक एनोटेशन, लिख सकते हैं SneakyThrows in Lombok की तरह आप (जब से तुम सकता गलत लिखा है UTF-8!, शायद सबसे अच्छा) एक क्रम अपवाद फेंक कर सकते हैं। चाहे आप इस "बेहतर" पर विचार करेंगे, बस स्वाद का विषय है। :)

ध्यान दें कि इस प्रश्न पर https://softwareengineering.stackexchange.com/questions/122233/how-to-deal-with-checked-exceptions-that-cannot-ever-be-thrown पर चर्चा की गई थी।

+0

आपके उत्तर रे के लिए धन्यवाद; मुझे यकीन नहीं है कि मैं खाली पकड़ ब्लॉक (टिप्पणी या नहीं) की सिफारिश करता हूं, लेकिन आपके पास एक बिंदु है कि असंभव विकल्प * एक दिन संभव हो सकता है। विनोद के रूप में, मुझे यकीन है कि कई राय हैं (शायद कंपनी संस्कृति पर निर्भर करती है?) लेकिन आप सही हैं कि किसी को भी घंटों तक बग नहीं भुगतना चाहिए, केवल इसे मिशेल अपवाद और एक मजाकिया संदेश के कारण ढूंढना चाहिए। – Miquel

+0

मुझे खाली पकड़ ब्लॉक से नफरत है: "खाने" अपवाद भयानक अभ्यास है। और हाँ मैंने यह कहने की कोशिश की कि कुछ सर्कल में हास्य ठीक था; यह सिर्फ एक जोखिम है कि इसे कोड के भावी पाठक द्वारा समझा नहीं जा सकता है, इसलिए इस तरह के दृष्टिकोण पर ध्यान से विचार किया जाना चाहिए। यदि चुना गया है, तो इसे कुछ बनाने के लिए सबसे अच्छा है _all_ पाठक समझेंगे और ऐसा कुछ नहीं जो पॉप संस्कृति पर निर्भर करता है या कुछ गूढ़ता के संदर्भ में। ए "ब्रह्मांड के नियमों का उल्लंघन" _probably_ ठीक है। उस ने कहा, 'रनटाइम अपवाद' या उसके चचेरे भाई 'त्रुटि' सर्वश्रेष्ठ शर्त हैं। –

5

मैं मजाकिया संदेश छोड़ दूंगा।

बीटीडब्ल्यू: मेरे पास ऐसा मामला था जहां कोड का एक टुकड़ा (एक छोटी पुस्तकालय में) ने माना कि एक एन्कोडिंग उपलब्ध होगी। केवल इसे सीमित डिवाइस पर तैनात किया गया और रनटाइम पर विस्फोट हुआ।

चेक किए गए अपवाद हमारे कोड में स्थानों को दिखाने के लिए सेवा करते हैं जहां हमें एक सेकंड के लिए रोकना चाहिए और पथों को कम यात्रा करना चाहिए (जैसा कि "मेरा ऐप नेटवर्क मरने पर क्या होता है" और अन्य कोने के मामलों में)। IllegalStateException में उन्हें लपेटना और पुनर्विचार एक हस्ताक्षरित अनुबंध है, जहां प्रोग्रामर कहता है: "हां, सभी जोखिमों पर विचार किया जाता है कि मैं यहां स्पॉट के लिए पूरी ज़िम्मेदारी लेता हूं"। यदि यह चेक अपवादों के लिए नहीं था, तो हम विचार की सादे कमी से एक विवेकपूर्ण निर्णय जानने का कोई तरीका नहीं करेंगे।

+0

असंभव संभव बनाने पर आपके उदाहरण के लिए बहुत बहुत धन्यवाद। यह वही है जो मुझे डर था, और यही कारण है कि मैं आप लोगों से जांचना चाहता था। इसके अलावा, मैं चेक अपवादों के खिलाफ ranting नहीं था, मैं उन्हें जावा का एक मौलिक हिस्सा मानता हूं, लेकिन असंभव (वास्तव में असंभव?) वाले लोगों को संभालने के तरीके पर सोच रहा था – Miquel

0

यहाँ मेरी समाधान है - Android के लिए विकसित की है, लेकिन आसानी से "नियमित" जावा के लिए अनुकूलित किया जा सकता:

public class ImpossibleException extends RuntimeException { 
    public ImpossibleException(@NonNull String whyNotPossible) { 
     this(whyNotPossible, null); 
    } 

    public ImpossibleException(@NonNull String whyNotPossible, Throwable throwable) { 
     super("Impossible exception: " + whyNotPossible, throwable); 
     Log.e("Impossible", whyNotPossible, throwable); 
    } 
} 

उपयोग:

try { 
    byte[] data = "Hello".getBytes("utf-8"); 
    Log.i("Test", "data.length=" + data.length); 
} catch (UnsupportedEncodingException e) { 
    throw new ImpossibleException("Android always supports utf-8", e); 
} 

whyNotPossible निर्माता त्रुटि लॉग इन करने की कोई आवश्यकता नहीं है इसका मतलब है जहां यह होता है, और टिप्पणी के लिए भी कोई आवश्यकता नहीं है।

मुझे लगता है कि यह स्वाद का विषय है यदि यह ImpossibleException extends RuntimeException या ImpossibleError extends Error होना चाहिए।

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