ماڈیول اسباق (4/4)
خرابی سے نمٹنے: کوشش کریں/سوائے
جب رن ٹائم پر کچھ غلط ہو جاتا ہے (صفر سے تقسیم، ایک گمشدہ کلید، ایک
غیر مطابقت پذیر اقسام پر آپریشن) ازگر ایک استثنیٰ پیدا کرتا ہے۔ بغیر
ہینڈلنگ، استثناء پروگرام میں خلل ڈالتا ہے۔ try / except کے ساتھ آپ
اسے پکڑ سکتے ہیں اور فیصلہ کر سکتے ہیں کہ کیا کرنا ہے۔
بنیادی شکل
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # Nonetry:بلاک میں وہ کوڈ ہے جو ناکام ہو سکتا ہے۔except <ErrorType>:کو صرف اس صورت میں عمل میں لایا جاتا ہے جب اس غلطی کی قسم کو اٹھایا جائے۔tryکے اندر۔
استثنائی پیغام کو پکڑنا
استثنیٰ آبجیکٹ کو کسی نام سے باندھنے کے لیے as کا استعمال کریں:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"ایک ساتھ متعدد اقسام
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = Noneاقسام کا ایک مجموعہ ان اقسام (یا ذیلی طبقات) میں سے کسی بھی استثناء کو پکڑتا ہے۔
مکمل ڈھانچہ: کوشش کریں / چھوڑ کر / اور / آخر میں
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— اس کوڈ کے لیے استعمال کریں جوtryکی کامیابی پر منحصر ہے۔ رکھ لو الگ کریں تاکہ آپ غلطی سے غیر متعلقہ استثناء کو نہ پکڑیں۔finally— صفائی جو ہمیشہ ہونی چاہیے (فائل کو بند کرنا، جاری کرنا وسائل)۔ کامیابی اور غلطی دونوں پر پھانسی دی گئی۔
استثنیٰ کو بڑھانا: raise
کبھی کبھی آپ وہ ہوتے ہیں جو یہ اشارہ کرنا چاہتے ہیں کہ کچھ غلط ہو گیا ہے:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bسب سے عام بلٹ ان مستثنیات جن کا آپ سامنا کریں گے اور اضافہ کریں گے:
ValueError— قدر کی صحیح قسم ہے لیکن ناقابل قبول ہے (مثلاً تجزیہ کرنا)۔TypeError— قسم غلط ہے (جیسےlen(42))۔KeyError/IndexError— غائب کلید/انڈیکس۔ZeroDivisionError— صفر سے تقسیم۔FileNotFoundError,PermissionError— فائل سسٹم آپریشنز۔
دوسرے اور آخر میں ٹرائی بلاکس میں شقیں
ایک try بلاک دو اضافی شقوں کی وضاحت کر سکتا ہے:
else: صرف اس صورت میں عمل میں لایا جاتا ہے جبtryبلاک بغیر کسی استثناء کے مکمل ہو جائے۔finally: ہمیشہ پھانسی دی جاتی ہے، قطع نظر اس کے کہ کوئی استثناء واقع ہوا ہو۔ یہ وسائل کو صاف کرنے کے لیے مثالی ہے (جیسے کھلی فائل یا ڈیٹا بیس کنکشن کو بند کرنا)۔
خود ہی آزمائیں۔
ایک ایسا اظہار لکھیں جو int('abc' کی کوشش کرتا ہے): اگر ValueError اٹھایا جاتا ہے، تو سٹرنگ 'error' کو 'نتیجہ' میں تفویض کریں؛ بصورت دیگر نمبر تفویض کریں۔ `نتائج` کا اندازہ لگائیں۔
اشارہ دکھائیں۔
int('abc') ValueError کو بڑھاتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
'divide(a, b)' کی وضاحت کریں جو a/b لوٹاتا ہے لیکن اگر b 0 ہے تو پیغام 'تقسیم صفر' کے ساتھ ValueError کو بڑھاتا ہے۔ پھر کوشش/سوائے کے اندر divide(10, 0) کو کال کریں اور پکڑے گئے استثنا کی تار کو `پیغام` کے لیے تفویض کریں۔
اشارہ دکھائیں۔
فنکشن کے اندر ValueError('...') بڑھائیں۔ ای کے بطور ValueError کے علاوہ کیچ کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
اضافی چیلنج
سٹرنگ \`text_val = "abc"\` کو عدد میں تبدیل کرنے کے لیے \`try-except\` بلاک لکھیں۔ اگر تبدیلی \`ValueError\` کو بڑھاتی ہے تو \`None\` کو \`نتائج\` تفویض کریں۔ بصورت دیگر، تبدیل شدہ نمبر تفویض کریں۔ آخر میں، \`نتائج\` کا اندازہ لگائیں۔
اشارہ دکھائیں۔
استعمال کریں try: result = int(text_val) اس کے بعد ValueError کے علاوہ: result = None۔
3 کوششوں کے بعد حل دستیاب ہے۔