अजगर में, आप सूचकांक एक आउट-ऑफ-सीमा कुंजी/सूचकांक के साथ एक संग्रह संरचना, आप चेहरे पर एक थप्पड़ मिलता है:क्या मैं कृपया ArrayOutOfBoundsException कर सकता हूं?
>>> [1, 2, 3][9]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
एक अपवाद है कि; यह बेसएक्सप्शन से निकला है, और एक को संभालने में असफल मेरे प्रोग्राम को क्रैश करेगा, जो लगभग हमेशा चाहता है।
पर्ल 5 और 6 की सूची अनुक्रमण के बारे में परवाह नहीं लगता है बाहर के सीमा अनुक्रमण:
$ perl6
> my @l = (1..4);
[1 2 3 4]
> say @l[2];
3
> say @l[9];
(Any)
> print @l[9];
Use of uninitialized value @l of type Any in string context
<snip>
True
> my $x = @l[9]; # even assignment doesn't error! who decided this was okay!?
> say $x; print $x;
(Any)
Use of uninitialized value $x of type Any in string context
<snip>
यह मूल रूप से पर्ल 5 में एक ही बात है, को छोड़कर आप एक मूल्य नहीं मिलता है वापस आ गया, लेकिन निष्पादन सामान्य के रूप में जारी है।
मुझे समझ में नहीं आता कि क्यों बाहर की सीमाएं चुप होनी चाहिए। आपको वह मान प्राप्त करने वाली एकमात्र चेतावनियां "अनियंत्रित" हो सकती हैं (लेकिन हम सभी जानते हैं कि इसका अर्थ वास्तव में मौजूद नहीं है) जब आप इसे कुछ फ़ंक्शंस देते हैं।
क्या मैं इसे किसी भी तरह ठीक कर सकता हूं? मैं जंक इंडेक्स पर मरने वाले डिफ़ॉल्ट व्यक्ति को ओवरराइड करने के लिए अपने स्वयं के पोस्ट-सर्फिक्स इंडेक्सिंग ऑपरेटर को कार्यान्वित कर सकता हूं, लेकिन एक अनियमित मूल्य और Any
टाइप के बीच अंतर बताने का कोई तरीका नहीं है। I ऐसा करने का एकमात्र तरीका यह जांचना है कि अनुरोधित अनुक्रमणिका List.elems()
सीमा में है या नहीं।
क्या इसका उपयोग करने के लिए मैं (अधिमानतः न्यूनतम, सरल, साफ, पठनीय, आदि) समाधान का उपयोग कर सकता हूं?
किसी को भी करने से पहले कहते हैं, "हाँ, लेकिन चर my $x;
तरह uninitialised है,!": आप स्मृति आप आवंटित नहीं किया का उपयोग करता है, तो सी में आप एक segfault मिलता है, मुझे ऐसी सुरक्षा क्यों नहीं मिल सकती है?
मैं दोनों पर्ल और पर्ल 6 के रूप में इस टैग किया है, क्योंकि जब मैं पर्ल 6 सीख रहा हूँ और इस सवाल का विवरण ज्यादातर 6 पर लागू होते हैं, मुख्य विचार दोनों 5 का एक साझा पहलू हो रहा है और 6.
सी में सेगमेंटेशन गलती निष्पादन से बेहतर है जैसे कि कुछ भी नहीं हुआ। – cat
पर्ल ऐसा करता है जो आप इससे पूछते हैं कि इससे कोई फर्क नहीं पड़ता। यह आपको लगता है कि आप क्या पूछ रहे हैं, यह वास्तव में कुछ भी नहीं मानता है। यह वास्तव में एक उड़ान छलांग नहीं दे सका अगर आप जानते हैं या चाहते हैं कि आप इसके लिए क्या पूछ रहे हैं तो यह आपको केवल देगा। यदि आप 'परिभाषित' की जांच करते हैं तो आपको क्रैच जैसे अपवादों का उपयोग करने की आवश्यकता नहीं है। असल में यह एक आदर्श बदलाव है और एक पायथन डेवलपर होने के नाते यह आलेख काफी अच्छी तरह से विचारों के अंतर को रेखांकित करता है: http://yosefk.com/blog/what-makes-cover-up-preferable-to-error-handling.html – scrappedcola
@scrappedcola प्रतिक्रिया के लिए धन्यवाद! मुझे पता है, आप बता सकते हैं कि मैं पाइथोनिज्म से भरा हूं लेकिन मैं किसी अन्य भाषा के बारे में नहीं सोच सकता जहां यह दुर्घटना नहीं पैदा करेगा, क्योंकि सिर्फ कोई अन्य तार्किक प्रतिक्रिया नहीं है। – cat