خطایابی

برنامه نویسی یک فرایند پیچیده می باشد و چون این روند پیچیده و بعضا بسیار گسترده و عظیم توسط انسان انجام می گیرد امکان اشتباه و بروز خطا امری بدیهی می باشد . در اصطلاح برنامه نویسی به مشکلاتی مختلف و متنوعی که دلیل اتفاق آن متفاوت و متغییر می باشد باگ (bug) یا خطا گفته می شود . فرایند شناسایی و رفع خطاها و باگ های موجود در یک برنامه و نرم افزار خطایابی یا اشکال زدایی (Debugging) نامیده می شود .

در علم برنامه نویسی کامپیوتر سه نوع اصلی خطا یا باگ موجود می باشد که عبارتند از خطای منطقی (syntax error) ، خطای زمان اجرا (runtime) ، خطای معنایی ( semantic error)

 

خطای نحوی(syntax error)

مفسر پایتون فقط قادر به اجرای کدی است که از قواعد نحوی زبان پایتون تبعیت کند . در غیر اینصورت اجرای روند اصلی برنامه متوقف شده و پیغام خطایی نمایش داده می شود . نحو یک زبان برنامه نویسی(language syntax) همان ساختار و قوانین آن زبان خاص می باشد . برای مثال در زبان انگلیسی هر جمله ای باید با حرف بزرگ شروع و با یک علامت خاتمه دهنده جمله چون نقطه پایان یابد . هر گونه ساختار متفاوت یک خطای نحوی می باشد .

اگر در بخشی از برنامه خطای نحوی وجود داشته باشد برنامه قابل اجرا نخواهد بود ! در این حالت مفسر پایتون با چاپ کردن عبارتی سعی می کند محل وقوع خطا و نوع آن را مشخص نماید تا برنامه نویس برای رفع آن اقدام نماید . در روند برنامه نویسی و ادامه کار با این نوع خطا به وفور برخورد خواهید کرد . به مرور زمان و پس از شناخت انواع مختلف خطاها و روش های حل و خطایابی آن سرعت شما در خطایابی برنامه بهتر و بهتر خواهد شد .

خطای زمان اجرا(runtime error)

خطای زمان اجرا که نام دیگر آن استثنا(exception) می باشد نوعی از خطا می باشد که تا زمان اجرا برنامه نهفته باشد و بهنگام اجرا و در شرایطی خاص بروز نماید . این نوع خطاها چون در شرایط استثنایی و ویژه رخ می دهند و ممکن است در حالت عادی بوجود نیایند,استثنا نامیده می شوند . برای مثال یک نوع بسیار معروف و معمول این نوع خطا خطای تقسیم بر صفر هست . اگر در روند اجرای برنامه بخواهید عددی را بر صفر تقسیم کنید با خطای زمان اجرا مواجه می شوید یا اصطلاحا یک استثنا به وقوع می پیوندد . برنامه پیغام خطایی چاپ کرده و از روند عادی خارج می شود . پیدا کردن و رفع چنین خطاهایی نسبت به خطای نحوی سخت تر بوده و نیاز به وقت و بررسی بیشتری دارد .

خطای معنایی(semantic error)

نوع سوم خطا با نام خطای معنایی شناخته می شود . در این حالت هیچگونه پیغام خطایی ظاهر نمی گردد و برنامه بصورت درست تفسیر می شود اما نتایج حاصل از برنامه دور از انتظار است . این خطا زمانی پیش می آید که برنامه نویس به اشتباه کدی بنویسد که هدف اصلی برنامه نباشد یا باعث تولید خروجی غلط شود . این نوع خطا بدترین نوع خطا می باشد , چون در این حالت مفسر پایتون هیچ کمکی به تشخیص خطا نمی کند و اصلاح خطا فقط به وسیله ی برنامه نویس صورت می گیرد. در این حالت برنامه نویس باید با توجه به خروجی موجود ، خروجی مطلوب و ورودی ها سعی در درک و شناسایی روند کار کرده محل مشکل را شناسایی و مشکل را برطرف نماید .

برای خطایابی این نوع امکانات و روش های مختلفی موجود می باشد .برای مثال با استفاده از این روش ها برنامه نویس می تواند با وارد کردن ورودی روند برنامه و نحوه انجام دقیق و تک تک دستورات را تا مرحله خروج نتیجه تحت نظر بگیرد .و یا برنامه نویس میتواند در بین دستورات از دستور print برای نمایش خروجی حاصل از هر دستور استفاده کند و به محض مشاهده ی خطا در جهت اصلاح آن اقدام کند.ولی بهترین روش برای اصلاح چنین خطاهایی استفاده از اشکالزداها(debugger)است. مانند ollydbg:(http://www.freedownloadscenter.com/Programming/Misc__Programming_Tools/OllyDbg.html) که توسط آقای Oleh Yuschuk نوشته شده.

مدیریت خطا

try وexcept

پایتون برای مدیریت خطا از ٍمدیریت استثنا(Exception handling) استفاده می کند.برای روشن شدن فایده ی استفاده از مدیریت استثنا همین کافیست که بدانیم مفسر پایتون وقتی با استثنایی در برنامه مواجه می شود رون عادی برنامه را رها کرده و برنامه به یکباره پایان می یابد.ولی برنامه با استفاده از مدیریت استثنا می تواند از این فاجعه جلوگیری کند و در شرایط استثنایی فقط یک پیغام استثنا پرتاب کرده و به روند عادی برنامه برگردد. عبارت مورد نیاز برای کنترل استثناها در پایتون try وexcept است. به برنامه زیر توجه کنید:

s=raw_input('enter value') try:

   if type(int(s))==type(123):
       print 'YES types are equal'

except:

   print 'Types not equal..Throw exception..'

در این مثال ابتدا داده با استفاده از تابع ()raw_input(این تابع با اعلان متن(enter value)از کاربر در خواست یک رشته می کند و پس از اینکه کاربر کلید enter را میزند تابع رشته ی ورودی را در s ذخیره می کند) گرفته شده و به متغیر s انتساب داده می شود . اگر نوع داده ی s برابر عدد صحیح باشد مقدار 'YES types are equal' در صفحه نمایش چاپ می شود و در غیر اینصورت Types not equal..Throw exception..' چاپ می شود. با استفاده از دستور except می توان نوع استثنا مورد نظر را تعیین کرد که در صورت بروز آن استثنا, قطعه کد مربوط به مدیریت آن شروع شود . مثل except Type Error و اگر هم هیچ استثنایی را ننویسیم تمام حالات در نظر گرفته می شود .

try وexcept همراه else

دستور try وexcept باید همیشه پشت سر هم در کد گنجانده شوند و بعد از آنها میتوان else نیز بکار برد. در این حالت اگر استثنایی در دستور try رخ دهد(قسمت دوم اجرا شود) دیگر else اجرا نمی شود و فقط except اجرا می شود و اگر استثنایی در دستور try رخ ندهد except اجرا نمی شود و else اجرا می شود.

مثال قبل همراه با else

s=raw_input('enter value') try:

   if type(int(s))==type(123):
       print 'YES types are equal'

except:

   print 'Types not equal..Throw exception..'

else:

   print s


try وfinally

دستورات متعلق به finally در هر صورت اجرا می شوند و این قسمت معمولا برای اعلان یک پیغام حاکی از اتمام استثنا و... استفاده می شود.

* نکته ی1: دستور finally مانند except می تواند یک استثنا پیشفرض بگیرد

* نکته ی2:میتوان از دستورات try تو در تو استفاده کرد مانند مثال زیر:

s=raw_input('...') try:

   if type(int(s))==type(123):
       print 'YES'

try : print 10/0 except: print'geeg' finally: try: s=raw_input('...') if type(int(s))==type(str): print 'YES' except: print 'try..try..try'

 

یک مثال

شما در درس های گذشته نمونه هایی از پیام های خطای پایتون را مشاهده نمودید . که شامل اطلاعاتی در مورد نوع و نحوه بروز اشکال و خطای موجود می باشد . برای مثال اگر سعی کنید به اندیسی دسترسی یابید که تعریف نشده با پیغام خطایی مواجه خواهید شد .

>>> omelet["pate"] Traceback (most recent call last):

 File "<stdin>", line 1, in ?

KeyError: 'pate'

همانطور که مشاهده می کنید نوع خطا KeyError می باشد . شما می توانید با استفاده از دستور ... try ... except خطاهای بوجود آمده را مدیریت نمایید در این حالت کد های مورد نظر در داخل بخش try نوشته می شود و با استفده از بخش except و تعیین نوع خطای بوجود آمده دستوراتی را که باید هنگام بوجود آمدن این خطا اجرا شوند را بنویسید . مثالی را مطرح کرده و در آن سعی می کنیم به اندیسی دسترسی یابیم که وجود ندارد .

>>> omelet= >>> try: ... if omelet["mushroom"] > 0: ... print "Sure, it have some mushroom" ... except KeyError: ... print "Aww, there’s no mushroom. Lets go shopping !" ... Aww, there’s no mushroom. Lets go shopping !


صفحه قبلی: پایتون
صفحه بعدی: PyGTK