
آشنایی با خطاهای برنامه نویسی باعث افزایش مهارت و دقت ما در کدنویسی خواهد شد. در این آموزش با انوع اصلی خطا در برنامه نویسی آشنا میشوید. فرقی نمیکند که با چه زبانی کد میزنید، دلیل این Error ها همیشه یکسان است.
اول از همه باید توضیح دهم چرا یادگیری خطاهای رایج برنامهنویسی میتواند مفید باشد ؟
چون کدهای یک برنامه توسط انسان نوشته میشود و انسان هم ممکن است دچار خطا شود، بروز خطای برنامه نویسی اتفاقی معمول و اجتنابناپذیر است. حتی حرفهایترین برنامهنویسها هم گاهی دچار خطا شده و کدهایشان با Error مواجه میشود!
یادگیری خطاها در برنامه نویسی دو مزیت بزرگ برایتان دارد:
- اگر دلیل بروز خطایی که روی داده را بدانید میتوانید خیلی سریعتر آن را رفع کنید.
- در هنگام کدنویسی یا آموزش برنامهنویسی به نکات مرتبط بیشتر توجه خواهید کرد.
در ادامه با انواع خطا در برنامه نویسی که ممکن است با آن مواجه شوید آشنا خواهیم شد.
به یاد داشته باشید که اگر در فرآیند برنامهنویسی با خطایی روبهرو شدید، نباید دلسرد شوید، بلکه باید به یادگیری و تمرین خود بیشتر اهمیت دهید. یادتان باشد حرفهایترها هم یک روزی از جایی که شما هستید شروع کردهاند.
ابتدا چهار ارور اصلی در برنامه نویسی را بررسی کرده و در انتها ۲ نوع غیرمعمولتر را معرفی خواهم کرد.
فهرست محتوای آموزش
خطای نحوی (Syntax Error)
اولین، رایجترین و شاید سادهترین نوع خطا، ارور نحوی است. این خطا مربوط به زمان نوشتن کدهای برنامه (قبل از کامپایل و اجرا شدن) است.
در انگلیسی به این خطا syntax error (سینتکس ارور) گفته میشود. در فارسی با نامهای خطای گرامری، خطای دستوری یا خطای نوشتاری کد نیز شناخته میشود.
بگذارید با یک مثال ساده این نوع خطا را توضیح دهم.
فرض کنید در زبان فارسی یک نفر بگوید «من خواهید آمد»! 😐 قاعدتاً از او ایراد میگیریم که ساختار جملهای که گفتی اشتباه است!
یا شاید بگوید «او نشستند»؛ این جمله باز هم از لحاظ دستوری یا گرامری اشتباه است.
همه زبانهای برنامهنویسی یک ساختار دستوری مشخصی دارند. به این ساختار اصطلاحاً syntax گفته میشود.
اگر در نوشتن یک برنامه به زبان مورد نظر، اصول (دستور گرامری) آن زبان را رعایت نکنیم، با خطای دستوری در برنامه نویسی مواجه خواهیم شد.
مثلاً برای تعریف رشته متنی معمولاً آن را درون علامت کوتیشن میگذاریم. اگر یک رشته متنی به صورت زیر تعریف کنیم، کد ما دارای خطای نحوی است چون در ابتدای آن "
قرار ندادهایم.
wrong_string = Wrong defined sample string"
یا فرض کنید در یک جای برنامه قرار میدهیم i =
و دیگر چیزی نمینویسیم. این تعریف ناقص است و باعث میشود کد ما دارای خطای گرامری باشد.
معمولاً در استفاده از ابزارهای برنامهنویسی (IDEها) این خطاها تشخیص داده شده و به ما اعلام میشود. کامپایلرها نیز قبل از ترجمه کد، ساختار آن را از نظر دستوری بررسی میکنند.
خطای زمان کامپایل (Compile Error)
خطای دیگر خطای همزمان با ترجمه (یا Compile Time Error) است. معمولاً این ارور در زبانهای برنامه نویسی کامپایلری رخ میدهد.
در اجرای برنامه یاد گرفتیم که زبانهای کامپایلری مثل زبان جاوا قبل از اجرا باید compile شوند. فرآیند ترجمه کد پیچیده است اما در همین حد بدانید که لازم است مقدماتی برای آن فرآهم شود. یکی از مقدماتی که به ما مربوط است، وجود کلیه فایلهای یک برنامه (اگر برنامه دارای چند فایل کد است) و در دسترس بودن کتابخانههای استفاده شده در برنامه است.
اگر در هنگام کامپایل کردن کد، یک یا چند مورد از این مقدمات فرآهم نباشد، با کامپایل ارور مواجه خواهیم شد.
خطای زمان اجرا (Run-Time Error)
فرض کنید کد به درستی نوشته شده و با موفقیت کامپایل شده است. در هنگام اجرای کد، شرایطی به وجود میآید که این کد به درستی اجرا نمیشود.
برای مثال، اگر برنامه ما فایلی را در کنار خود لازم داشته باشد تا چیزی از داخل آن خوانده شده یا در آن بنویسید و این فایل وجود نداشته باشد، با خطای زمان اجرا در برنامهنویسی مواجه خواهیم شد. در واقع خطایی در هنگام کار با فایل رخ داده است.
یا فرض کنید قرار بوده سیستمی دارای ۴ گیگابایت حافظه اصلی باشد. اما در هنگام اجرای کد، فقط ۲ گیگ رم در اختیار داریم.
خطای Run Time یک ارور غیر منتظره است. یعنی همه چیز به درستی عمل میکند تا این که یک نقص به وجود میآید.
یکی از خطاهای معروف زمان اجرا در برنامه نویسی، عملیات تقسیم بر صفر است. میدانیم که تقسیم هر عددی بر صفر، یک مقدار تعریف نشده به شمار میآیند. حال اگر ما یک ماشین حساب نوشته باشیم که دو عدد ورودی از کاربر و عملگر را گرفته و حاصل را برمیگرداند.
اگر کاربر سیستم عملیات تقسیم را انجام دهد و عدد دوم را صفر تعریف کند، با خطای زمان اجرا مواجه میشویم.
در حقیقت کد ما هیچ ایرادی نداشته، بلکه در هنگام اجرا، شرایطی پیش آمده که باعث Run Time Error شده است.
رفع خطای زمان اجرا در برنامه نویسی
همانطور که گفتم، خطای زمان اجرا کاملاً غیرمنتظره است! اما با امکاناتی که زبانهای برنامهنویسی در اختیار ما قرار دادهاند میتوانیم آنها را مدیریت کنیم.
به این کار مدیریت خطا (Error Handling) کفته میشود. در این فرآیند، شرایطی که احتمال میدهیم باعث بروز خطا شوند را بررسی میکنیم. مثلاً:
- در هنگام گرفتن عدد از کاربر به عنوان مقسوم علیه، با یک ساختار شرطی ساده چک کنیم که عدد مخالف صفر باشد.
- در هنگام کار با فایل یا مواردی که مرتبط با سیستم است، یک حالت دوم نیز در نظر بگیریم. معمولاً این کار با تعریف بلوکهای try-catch انجام میشود.
خطای منطقی (Logical Error)
خطرناکترین نوع ارور، خطای منطقی در برنامهنویسی است!
به این جا ۳ نوع اصلی خطای برنامهنویسی را با هم بررسی کردیم. این خطاها را کامپیوتر تا حدودی میتواند تشخیص دهد. حتی انسانها نیز به کمک کامپیوترها میآیند تا از بروز خطاهای قبلی جلوگیری کنند.
در خطای منطقی، کدها صحیح هستند، کامپایل به درستی انجام میشود و ورودیهای برنامه نیز کاملاً صحیح و بدون ایراد خواهند بود. اما نتیجه کار، اشتباه است!
فرض کنید عمل ضرب برای یک ماشین حساب را نوشتهاید. در سورس برنامه به جای عمگر ×
از عملگر +
استفاده کردهاید. کد به درستی اجرا میشود ولی نتیجهای که در انتها داریم صحیح نیست.
این نوع ایرادات در فرآیند اجرای برنامه هیچ مشکلی ایجاد نمیکند. به این دلیل خطای منطقی را یک باگ نرم افزاری در نظر میگیریم که نتیجه اشتباه است. به همین دلیل است که گفتم خطرناکترین خطای برنامهنویسی همین نوع خطاست.
خطای منطقی در برنامه نویسی را چگونه تشخیص دهیم ؟
از آن جا که خطاهای Logical ساختار یا دلیل خاصی ندارند، پیدا کردنشان کمی مشکل است. اگر برنامه ما یک خطای منطقی داشته باشد، بهتر است ابتدا بخش به بخش کدهایی که در محاسبه خروجی دخالت داشتهاند را بررسی کنیم.
اگر خطایی در نوشتن کدها پیدا نشد، باید فلوچارت یا الگوریتم برنامه را مجدداً بررسی کنیم. گاهی اوقات خطای ما در کدها نیست، بلکه در نحوه تحلیل و تعریف الگوریتم برنامه است.
تا این جا با انواع خطای برنامهنویسی آشنا شدیم. هر زبان برنامهنویسی ممکن است خطاهای بیشتری داشته باشد. معمولاً تمام خطاهای برنامهنویسی در دستهبندی همین چهار نوع قرار میگیرند.
سایر خطاهای برنامه نویسی
با وجود اینکه با تمام خطاها آشنا شدیم، اما ۲ نوع خطای رایج دیگر در برنامهنویسی را با هم بررسی کنیم. در زبانهای مختلف میتوانیم ارورهای بیشتری داشته باشیم. مثلاً در زبان C خطای Linker Error داریم که در در حالت کلی در دستههای بالا قرار میگیرد.
خطای منبع (Resource Error)
هر برنامهای برای اجرا به منابع مختلفی نیاز دارد. این منبع میتواند قدرت پردازشی CPU، میزان فضای RAM یا حتی دستگاههای بیرونی (مثل پرینتر یا Wi-Fi) باشد. اگر منابعی که به برنامه داده شده است کافی نباشد، معمولاً برنامه ما درخواست منابع بیشتر از سیستم عامل خواهد کرد.
اگر سیستم عامل منابع بیشتری در اختیار نداشته باشد یا مقدار بیشتری از آن را در اختیار برنامه قرار ندهد، ممکن است با خطای resource مواجه شویم.
در حقیقت این خطا به این معنی است که برنامه نتوانسته منابع مورد نیاز خود را به اندازه کافی در اختیار بگیرد؛ در نتیجه اجرای آن با مشکل روبهرو خواهد شد.
خطای واسط (Interface Error)
نرمافزارها و حتی سختافزارها برای تعامل با هم از واسط (اینترفیس یا interface) استفاده میکنند. تعریف واسط بحث مفصلی است که میتوانید در مورد آن در برنامهنویسی شئگرا بیشتر بخوانید.
فرض کنید یک وبسرویس (API) داریم. برای استفاده از آن باید پارامترهایی را به همراه درخواست خود ارسال کنیم. اگر مقادیر ارسالی ما با دادههایی (فیلدهایی) که در مقصد مورد نیاز است تطابق نداشته باشد، با خطای واسط برنامهنویسی مواجه می شویم.