منطبق با جدیدترین نگارش - قسمت 17
آموزش رایگان پایتون (python)- آشنایی با خطاهای معنایی، منطقی و نحوی در پایتون
در شماره گذشته آموزش پایتون مبحثی تحت عنوان مدیریت خطاها در پایتون را آغاز کردیم و به شما گفتیم خطاها به دو گروه طبقه‌بندی می‌شوند. خطاهایی که در زمان مشخصی رخ می‌دهند و خطاهایی که دارای نوع مشخصی هستند. در این شماره قصد داریم اطلاعات بیشتری درباره خطاها به دست آوریم.

برای مطالعه بخش شانزدهم آموزش رایگان پایتون اینجا کلیک کنید


طبقه‌بندی خطاهای رخ داده

خطاها ممکن است در زمان مشخصی رخ دهند. خطاهایی که در زمان‌های خاصی رخ می‌دهند به دو گروه خطاهای زمان اجرا و خطاهای زمان کامپایل طبقه‌بندی می‌شوند.

خطاهای زمان کامپایل

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

خطاهای زمان اجرا

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

کشف نوع خطا

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

ترکیب نحوی

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

m=1

M="string"

print(m+1)

در قطعه کد بالا دو متغیر به نام‌های m و M تعریف شده‌اند. اگر قطعه کد بالا را اجرا کنید در خروجی عبارت 2 را مشاهده خواهید کرد. اما اگر در فرمان print از متغیری که M نام دارد استفاده کنید، پایتون با نمایش پیغام خطایی مانع از اجرای برنامه شما می‌شود. به این مدل اشتباهات، خطای ترکیب نحوی می‌گویند. در تصویر زیر ابتدا M بزرگ در فرمان print استفاده شده که باعث بروز خطا شده است. اما زمانی که در فرمان print از m کوچک استفاده شده است، حاصل جمع دو مقدار در خروجی چاپ شده است.

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

خطاهای معنایی

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

خطاهای منطقی

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

در شماره آینده آموزش پایتون به نحوه گرفتن/به‌دام انداختن خطاها آشنا خواهیم شد.

 
 

ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را می‌توانید از دکه‌های روزنامه فروشی تهران و شهرستان‌ها تهیه کنید. همچنین می‌توانید برای مطالعه شماره‌ها مختلف آن به کتابخانه‌های عمومی سراسر کشور مراجعه نمایید.

آخرین نسخه ماهنامه شبکه را دریافت کنید
برای دانلود ماهنامه شبکه 222 با پرونده ویژه «ترفندهای سیستم‌عامل‌ها» اینجا کلیک کنید.

اشتراک ماهنامه شبکه
اشتراک ماهنامه شبکه یکی دیگر از راه‌های دسترسی به مطالب مجله است؛ به ویژه اشتراک آنلاین که با قیمتی مناسب محتوای کامل مجله، شامل مطالب و آگهی‌ها را در ختیار شما قرار می‌دهد.

برچسب: 

مطالب پربازدید روز

پشتیبانی توسط ایران دروپال