سبق Exceptions

تعارف
استثنا تب ہوتا ہے جب پروگرام میں کوئی استثنائی صورت پیدا ہوتی ہے ۔ مثلا اگر ہم کوئی فائل پڑھنے کی کوشش کریں اور فائل موجود ہی نہ ہو ؟ اگر وہ غلطی سے حذف (delete) کر دی گئی ہو یا اس کا نام تبدیل کر دیا گیا ہو۔ ایسی صورتحال کو استثنا کے ذریعے سنبھالا جاتا ہے۔
اسی طرح اگر کسی پروگرام میں کوئی غیر درست بیان موجود ہو تو پائتھون نشاندہی (raises) کر دیتا ہے اور بتاتا ہے کہ کوئی غلطی ہے۔

Errors
ایک سادہ مثال پرنٹ فنکشن کال کی ہے۔ اگر غلطی سے print کی جگہ Print لکھا جائے تو کیا ہوگا ؟ اس صورت میں پائتھون نشاندہی کرتا ہے ایک غلطی کی۔
PHP:
>>> Print("Hello World")
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    Print("Hello World")
NameError: name 'Print' is not defined
>>> print("Hello World")
Hello World
NameError نامی استثنا کی نشاندہی کی گئی ہے اور اس جگہ کے بارے میں بھی پرنٹ کیا گیا ہے جہاں یہ غلطی واقع ہوئی ہے۔ ایک error handler یہ کام کرتا ہے جب کوئی غلطی پیدا ہوتی ہے ۔

Exceptions
اب ہم کوشش کریں گے کہ صارف سے کوئی نمبر درج کروائیں اور پھر اسے پڑھیں۔ اس کے بعد ہم Ctrl -D دبائیں گے اور دیکھیں گے کہ کیا ہوتا ہے۔


PHP:
>>> s = input("Enter something ..")
Enter something ..
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    s = input("Enter something ..")
EOFError: EOF when reading a line

پائتھون نے ایک غلطی EOFError کی نشاندہی کی ہے جس کا مطلب ہے کہ اسے فائل کی اختتامی علامت (Ctrl-d سے ظاہر کیا جاتا ہے) مل گئی ہے جس کی اسے توقع نہ تھی۔

چند مزید مثالیں:

PHP:
try:
    x = y
except:
    print('y not defined')
 
Output:
y not defined

PHP:
try:
    a = 1/0
except ZeroDivisionError as e:
    print (e)
 
Output:
division by zero
 
Handling Exceptions
استثنا (exception) کو سنبھالنے کے لیے ہم try .. except بلاک کا استعمال کرتے ہیں۔
تمام عمومی بیانات try بلاک میں رکھتے ہیں اور کوئی بھی غلطیوں کو سنبھالنے کا کوڈ except بلاک میں یعنی تمام error handlers ۔

PHP:
>>> s = input("Enter something ..")
Enter something ..
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    s = input("Enter something ..")
EOFError: EOF when reading a line

نتیجہ کچھ ایسے ہوگا ۔
کوڈ:
Enter something --> # Press ctrl-d
Why did you do an EOF on me?
 
Enter something --> # Press ctrl-c
You cancelled the operation.
 
 
Enter something --> no exceptions
You entered no exceptions

اس کوڈ میں ہم نے ایسے تمام بیانات جس سے کوئی غلطی یا استثنائی صورت پیدا ہو سکتی ہے اسے try بلاک میں رکھا ہے اور پھر غلطیوں اور استثنائی صورتوں کو سنبھالنے کا سارا کوڈ ہم نے except بلاک میں رکھا ہے۔
except بلاک میں ہم ایک غلطی یا استثنا(exception) بھی سنبھال سکتے ہیں اور ایک سے زیادہ استثنائی صورتیں قوسین (parenthesis) میں ایک لسٹ کے طور پر۔
اگر ایک یا زئاید استثنا(exception) کا کوئی نام نہ دیا جائے تو تمام غلطیاں اور استثنات ایک ہی جگہ نمٹ جاتی ہیں۔
ہر try بلاک کے ساتھ ایک except بلاک بھی ہوتا ہے۔

اگر کسی غلطی یا استثنا کے لیے کوئی بھی except بلاک نہ ہو تو پائتھون غلطی کے بارے میں ایک پیغام پرنٹ کرکے پروگرام کو ختم کر دیتا ہے۔
 
Raising Exceptions
استثنا(exception) کو ابھارا(raise) جا سکتا ہے نام کے ساتھ اور کچھ تفصیل کے استثنا کس چیز کے متعلق ہے۔
پہلے ہم دیکھ چکے ہیں کہ غلطی ہونے کی صورت میں استثنا پیدا ہوتا ہے مگر ہم چاہیں تو خود بھی کسی موقع پر کوئی استثنا پیدا کر سکتے ہیں اور پھر اسے کوڈ میں try بلاک کے بعد except بلاک میں سنبھال سکتے ہیں۔

raise بیان کی مدد سے پروگرامر کسی استثنا (exception) کو ہونے پر مجبور کر سکتا ہے۔ raise کے لیے واحد دلیل exception کا نام ہوتا ہے اور یوں استثنا واقع ہو جاتا ہے۔

PHP:
>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere

ایک اور طریقہ یہ بھی ہے کہ استثنا (exception) کو ابھار کر اسے except بلاک میں پکڑ کر کوئی کاروائی کر لی جائے۔ کوئی پیغام پرنٹ کروایا جا سکتا ہے یا کوئی اور کوڈ لکھ کر پروگرام کے نتائج کا رخ موڑا جا سکتا ہے۔

PHP:
try:
    level = 1
    if level < 2:
      raise NameError("level")
except NameError:
      print("New error")
 
Output:
New Error

اوپر والی مثال میں اگر level متغیر(variable) کی قیمت 1 ہو تو استثنا NameError ابھاری گئی ہے جو try بلاک کے اختتام کے بعد except بلاک میں استثنا(exception) کو اس کے نام سے گرفتار(catch) کر لیا گیا ہے۔
 
ابھی تک جو بھی استثنا ہم نے ابھاری ہے وہ پہلے سے پائتھون میں موجود ہوتی ہے اور اس کا نام ہو بہو لکھ کر ہی ہم اسے except بلاک میں گرفت میں لے کر اس پر کوئی کام کر سکتے ہیں۔ پہلے سے موجود استثنات () کی مثالیں اوپر ہم دیکھ چکے ہیں۔​
ZeroDivisionError​
NameError​
اگر ہم کوئی مرضی کی استثنا متعارف کروانا چاہ رہے ہیں جس کا نام ہم اپنی مرضی سے دیں تو اسے ایک کلاس ہونا لازمی ہے اور اس کی موروثی کلاس Exception ہونی چاہیے۔​
ایک مثال کے ذریعے اسے سمجھتے ہیں۔​
PHP:
class InputException(Exception):
    '''A user-defined exception class.'''
    def __init__(self, length, atleast):
        self.length = length
        self.atleast = atleast
 
try:
    s = input('Enter something --> ')
    if len(s) < 3:
        raise InputException(len(s), 3)
except EOFError:
    print('Why did you do an EOF on me?')
except InputException as x:
    print('ShortInputException: The input was of length {0}, was expecting at least {1}'.format(x.length, x.atleast))
else:
    print("Everything is fine")
اس کوڈ میں ہم نے ایک نئی ٹائپ متعارف کروائی ہے ، یہ نئی استثنائی ٹائپ ہماری بنائی ہوئی InputException کلاس ہے۔ اس میں ہم نے دو متغیرات(length اور atleast) کو شروع میں ہی کلاس object کو تفویض کر دیا ہے۔​
self.length = length​
self.atleast = atleast​
ہماری کلاس میں دو فیلڈ ہیں
length : جو کہ ان پٹ کی لمبائی پر مشتمل ہے
atleast : جو کہ کم از کم لمبائی ہے جو پروگرام صارف سے توقع کر رہا ہے۔

except جزو میں ہم نے استثنائی کلاس کا نام دیا ہے اور ایک متغیر کا بھی بتایا ہے جو استثنائی object کی معلومات پر اختیار رکھتا ہے۔ اگر length کی لمبائی تین سے کم ہے تو ایک پیغام پرنٹ ہوتا ہے جو صارف کے درج کردہ مواد کی لمبائی اور متوقع لمبائی کا بتاتا ہے۔
اگر سب ٹھیک ہے تو پھر else جزو میں کوڈ چلا جاتا ہے اور وہاں پرنٹ فنکشن سے ایک پیغام شائع ہو جاتا ہے۔
 
Top