Python – errors and exceptions தமிழில்

 

பைதான் – நிரல் அமைப்புப் பிழைகளும் இயக்க நேரப் பிழைகளும்

Errors and Exceptions

இதுவரை நாம் செய்த நிரல்களில் சில நேரம் பிழைகள் ஏற்படலாம். அவை பற்றி இங்கு விரிவாகக் காணலாம்.

8.1 Syntax Errors

ஒரு நிரலை தவறாக, எழுத்துப் பிழை அல்லது அமைப்புப் பிழையுடன் இயக்கும் போது ஏற்படுகிறது. பிழைக்கான காரணமும் காட்டப்படுகிறது.

உதாரணம்

>>> while True print ‘Hello world’

File “<stdin>”, line 1, in ?

while True print ‘Hello world’

^

SyntaxError: invalid syntax

பைதான் intrepreter நிரலை ஒவ்வொரு வரியாகப் படித்து அதை இயக்குகிறது. ஏதேனும் ஒரு வரியில் பிழை இருக்கும் போது, மொத்த இயக்கமும் நிறுத்தப் படுகிறது. மேற்கண்டவாறு பிழைச்செய்தி காட்டப்படுகிறது

>>> என்ற அம்புக்குறியிட்டு பிழை உள்ள வரி காட்டப் படுகிறது. அந்த வரியில் பிழை உள்ள முதல் வார்த்தை ^ என்ற அம்புக்குறி மூலம் காட்டப் படுகிறது.

மேற்கண்ட உதாரணத்தில் print ஆனது பிழை உள்ள வார்த்தையாகக் காட்டப் படுகிறது. ஏனெனில் அதற்கு முன் : இருக்க வேண்டும். (while உள்ளதால்)

File Name மற்றும் Line Number ம் காட்டப் படுகிறது. இதன் மூலம் பிழை உள்ள இடத்தை எளிதாகக் கண்டு பிடிக்கலாம். திருத்தலாம்.

இவ்வாறு நிரல் வரி மற்றும் அமைப்பில் உள்ள பிழை Syntax Errorஅல்லது Parsing Error எனப்படும்.

8.2 இயக்க நேரப் பிழைகள்

சில நேரங்களில் நிரல் வரிகள் சரியான அமைப்புடன் இருந்தாலும், இயக்கும்போது எதிர்பாராத பிழைகள் ஏற்படலாம். இவை இயக்க நேரப் பிழைகள் எனப்படுகின்றன. உதாரணமாக 0 ஆல் வகுத்தலைக் கூறலாம். இரண்டு எண்களை பயனரிடம் இருந்து பெற்று வகுத்தல் செய்வதாகக் கருதுவோம்.

பயனர் முழு எண்களாகத் தரும்போது, நிரல் நன்கு இயங்கும். அவர் இரண்டாவது எண்ணை 0 எனத் தந்தால், நிரல் பாதியிலேயை நின்று விடும். பின்வரும் பிழைச்செய்தி தரப்படும்.

>>> 10 * (1/0)

Traceback (most recent call last):

File “<stdin>”, line 1, in ?

ZeroDivisionError: integer division or modulo by zero

மேலும் சில உதாரணங்கள்.

>>> 4 + spam*3

Traceback (most recent call last):

File “<stdin>”, line 1, in ?

NameError: name ‘spam’ is not defined

>>> ‘2’ + 2

Traceback (most recent call last):

File “<stdin>”, line 1, in ?

TypeError: cannot concatenate ‘str’ and ‘int’ objects

என்ன மாதிரியான பிழை ஏற்பட்டுள்ளது என்று கடைசி வரியில் காட்டப் படுகிறது. பிழையின் வகையும் சொல்லப் படுகிறது.

ZeroDivisionError, NameError மற்றும் TypeError போன்றவை பிழை வகை ஆகும்.

Stack Traceback எனப்படும் விரிவான அலசலும் காட்டப் படுகிறது. பிழை ஏற்பட்ட வரி எண் மற்றும் பிழையின் இடமும் சுட்டிக் காட்டப் படுகிறது.

இது போன்ற விரிவான பிழைச் செய்தியால், நம்மால் சரியான இடத்தைக் கண்டுபிடித்து, அதை சரி செய்ய முடிகிறது.

8.3 இயக்க நேரப் பிழைகளை கையாளுதல்.

இயக்க நேரப் பிழைகள், நிரலின் முழு இயக்கத்தையும் பாதியிலேயே நிறுத்தி விடுகின்றன. அவற்றை நாமே திறமையாக கையாளலாம். ஏற்படக்கூடிய தவறுகளை முன்பே யூகம் செய்து அவற்றுக்கான ஏற்பாடுகளை செய்து விடலாம்.

பின்வரும் உதாரணத்தைக் காண்போம். ஒரு முழு எண் (Integer) ஐ சரியாகப் பெறும் நிரல் இது. முழு எண் தவிர வேறு ஏதேனும் தந்தால், நிரல் பாதியிலேயே நிறுத்தப் படுவதில்லை. ValueError என்ற பிழைச் செய்தி மட்டுமே காட்டப் படுகிறது. மீண்டும் எண் கேட்கும் செய்தி காட்டப் படுகிறது. முழு எண்ணைத் தரும் வரையில் இது தொடர்கிறது.

Ctrl + c மூலம் இதன் இயக்கத்தை பாதியில் நிறுத்த முடியும். அப்போது KeyboardInterupt என்ற Exception செயல்படுத்தப் படுகிறது

>>> while True:

… try:

… x = int(raw_input(“Please enter a number: “))

… break

… except ValueError:

… print “Oops! That was no valid number. Try again…”

இதன் இயக்கத்தை விரிவாகப் பார்ப்போம்.

* முதலில் try clause [ try மற்றும் except க்கு இடையில் உள்ளவை. ] இயக்கப் படுகிறது.

* இயக்க நேரப் பிழை Exception ஏதும் இல்லையெனில் except clause தவிர்க்கப் படுகிறது. Try ன் இயக்கம் நிறைவு பெறுகிறது.

* Try ல் ஏதேனும் இயக்கப் பிழை ஏற்பட்டால், அதன் இயக்கம் நிறுத்தப் படுகிறது. Except என்ற Keyword க்கு பக்கத்தில் உள்ள இயக்கநேரப் பிழையாக இருப்பின், அந்த Except clause இயக்கப் படுகிறது. பின் Try க்குப் பின் உள்ளவை இயக்கப் படுகின்றன.

* Except Keyword ல் உள்ளவை தவிர வேறு ஏதேனும் புதிய பிழை ஏற்படும் போது, இயக்கமானது, Try க்கு வெளியில் உள்ள பகுதிக்கு மாற்றப் படுகிறது. அங்கும் அவை யூகம் செய்யப் படவில்லை என்றால், Unhandled Exception என்று விரிவான பிழைச்செய்தி காட்டப்பட்டு, நிரலின் இயக்கம் பாதியிலேயே நிறுத்தப் படுகிறது.

ஒரு Try Statement ல் ஒன்றுக்கு மேற்பட்ட Except clause கூட இருக்கலாம். ஒவ்வொரு வகையான இயக்க நேரப் பிழைக்கும், ஒரு Except clause எழுதலாம். எத்தனை இருந்தாலும் ஏதேனும் ஒன்று மட்டுமே இயக்கப் படும்.

பின் வருவது போல ஒரே Except clause ல், பல பிழை வகைகளையும் கூட தரலாம்.

… except (RuntimeError, TypeError, NameError):

… pass

கடைசியாக நாம் தரும் except clause க்கு பெயர் எதுவும் தரத்தேவையில்லை. நாம் யூகம் செய்யாத பிழை ஏதும் ஏற்பட்டால், இது இயங்கும். இதை எழுதும் போது மிகவும் கவனமாக இருக்க வேண்டும். நிஜமாகவே நிரலில் உள்ள பிழைகளால் கூட இது இயக்கப் பட்டு விடும்.

import sys

try:

f = open(‘myfile.txt’)

s = f.readline()

i = int(s.strip())

except IOError as e:

print “I/O error({0}): {1}”.format(e.errno, e.strerror)

except ValueError:

print “Could not convert data to an integer.”

except:

print “Unexpected error:”, sys.exc_info()[0]

raise

இந்த Try….Except clause ல், நாம் Else clause ஐக் கூட சேர்க்கலாம். இதை பயன்படுத்தும் போது, எல்லா Except clause உடனும் பயன்படுத்த வேண்டும். Try clause ஆனது, Exception ஏதும் இல்லாமல், இயக்கப் பட்டுவிட்டால், பிறகு Else clause இயக்கப் படுகிறது

for arg in sys.argv[1:]:

try:

f = open(arg, ‘r’)

except IOError:

print ‘cannot open’, arg

else:

print arg, ‘has’, len(f.readlines()), ‘lines’

f.close()

இயக்கநேரப் பிழைகள் Try clauseல் மட்டுமின்றி, ஏதேனும் ஒரு function ஐ அழைக்கும் போது கூட நேரிடலாம். அவற்றைக்கூட மேற்கண்டவாறு எளிதில் கையாளலாம்.

>>> def this_fails():

… x = 1/0

>>> try:

… this_fails()

… except ZeroDivisionError as detail:

… print ‘Handling run-time error:’, detail

Handling run-time error: integer division or modulo by zero

ஸ்ரீனி tshrinivasan@gmail.com

இதழ் 23 நவம்பர் 2013

[wpfilebase tag=file id=43/]

%d bloggers like this: