मैं पायथन में अपवादों पर एक अध्याय के माध्यम से काम कर रहा हूं और लेखक निम्नलिखित उदाहरण देता है, कुछ अलग अपवाद एक सूची में संग्रहीत होते हैं, एक या कोई भी यादृच्छिक रूप से नहीं चुना जाता है और संभाला जाता है:

import random
some_exceptions = [ValueError, TypeError, IndexError, None]

try:
    choice = random.choice(some_exceptions)
    print(f'raising {choice}')
    if choice:
        raise choice('An Error') # Don't understand the need for the 'An Error' argument
except ValueError:
    print('Caught a ValueError')
except TypeError:
    print('Caught a TypeError')
except Exception as e:
    print(f'Caught some other error: {e.__class__.__name__}')
else:
    print('This code is called if there is no exception')
finally:
    print('This code is always called')

मुझे लाइन raise choice('An Error') समझ में नहीं आती है, शब्द 'एक त्रुटि' कंसोल के लिए कभी भी आउटपुट नहीं होते हैं और उदाहरण ठीक उसी तरह काम करता प्रतीत होता है जैसे उस लाइन को raise choice() में बदल दिया जाता है, क्या कोई विशिष्ट कारण है लेखक ने ऐसा किया?

0
Justin 11 मार्च 2021, 18:31

6 जवाब

सबसे बढ़िया उत्तर

अपवाद वर्ग भी हैं। स्ट्रिंग कक्षा में पारित पैरामीटर हैं।

In [10]: help(ValueError)

In [11]: v = ValueError("value is not accepted.")

In [12]: v
Out[12]: ValueError('value is not accepted.')

In [13]: v.args
Out[13]: ('value is not accepted.',)
3
Dyno Fu 11 मार्च 2021, 18:38

अपवाद वर्ग हैं। यदि आप अपना खुद का लिखते हैं (उदाहरण के लिए ValueError से) उदाहरण निर्माण के निर्माता - यह ValueError() लिखकर करते हैं - इस स्ट्रिंग को अपवाद की __str__ विधि द्वारा आउटपुट होने के लिए स्टोर कर सकते हैं। इसलिए यदि अपवाद प्रकार स्ट्रिंग तर्क उपयोगी साबित होने के कारण को इंगित करने के लिए अपर्याप्त है।

1
guidot 11 मार्च 2021, 18:40

ये दोनों टाइप एरर हैं (देशी पायथन में), लेकिन देखें कि कस्टम संदेश कैसे अलग है

>>> a = [1,2,3]
>>> a['d']

TypeError: list indices must be integers or slices, not str

>>> 1 in 'fs'

TypeError: 'in <string>' requires string as left operand, not int

और इसलिए, एक कस्टम त्रुटि संदेश उत्पन्न करने के लिए जो मौजूदा वर्ग का सबसेट है, आप यह कर सकते हैं:

>>> raise TypeError('meaningless type error')

TypeError: meaningless type error
1
Rishabh Kumar 11 मार्च 2021, 18:48

यह सिर्फ सामान्य उपयोग है। अपवाद (BaseException से व्युत्पन्न) में एक args सदस्य होता है जिसमें निर्माण के समय पारित पैरामीटर शामिल होते हैं, इसलिए वे 0 से n पैरामीटर स्वीकार कर सकते हैं। फिर भी BaseException.args के लिए डॉक्टर कहते हैं (मेरा जोर दें):

अपवाद निर्माता को दिए गए तर्कों का समूह। कुछ अंतर्निहित अपवाद (जैसे OSError) एक निश्चित संख्या में तर्कों की अपेक्षा करते हैं और इस टपल के तत्वों को एक विशेष अर्थ प्रदान करते हैं, जबकि अन्य को आमतौर पर केवल एक स्ट्रिंग के साथ बुलाया जाता है एक त्रुटि संदेश देता है।

1
Serge Ballesta 11 मार्च 2021, 18:42

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

import random
some_exceptions = [ValueError, TypeError, IndexError, None]

try:
    choice = random.choice(some_exceptions)
    print(f'raising {choice}')
    if choice:
        raise Exception('An Error') # Don't understand the need for the 'An Error' argument
except ValueError:
    print('Caught a ValueError')
except TypeError:
    print('Caught a TypeError')
except Exception as e:
    print(f'Caught some other error: {e.__class__.__name__}')
else:
    print('This code is called if there is no exception')
finally:
    print('This code is always called')

1
Siddharth Agrawal 11 मार्च 2021, 18:40

जब आप इस तरह से अजगर में पकड़ने की कोशिश करते हैं:

choice = ValueError
try:
    raise choice('An Error')
except ValueError as e:
    print(e)

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

choice = ValueError
a = int(input("Enter a number a"))
b = int(input("Enter a number b"))
try:
    error = "No error"
    if a == 0:
        error = "a is Null"
    if b == 0:
        error = "b is Null"
    raise choise(error)
except ValueError as e:
    print(e)

इस कोड में आप ट्रैक कर सकते हैं कि त्रुटि कहाँ से आती है यदि आप उदाहरण के लिए a या b से विभाजन करते हैं और आपको एक नल विभाजन त्रुटि मिलती है

1
Mario Khoury 11 मार्च 2021, 18:40