آموزشبرنامه نویسیدرس فیلمسی شارپ

خطا یابی در c#

در بحث خطا یابی در c# به تعریف خطا و انواع خطا و ایزارهای خطا یابی در visual studio  و سی شارپ c#  میپردازیم

به فرآیند اشکال زدایی و رفع خطای یک نرم افزار عملیات دیباگ کردن یا Debugging می گویند.

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

انواع خطا در برنامه نویسی

برای خطایابی برنامه نویسی سی شارپ در ابتدا باید انواع خطاها را بشناسیم و آن ها را برطرف کنیم.

1-خطای کامپایلری syntax error

یکی از خطاهای برنامه نویسی سی شارپ، خطای کامپایلری می باشد.

این خطا  خطای همزمان با ترجمه (یا Compile Time Error) نیز گفته میشود . معمولاً این ارور در زبان‌های برنامه نویسی کامپایلری رخ می‌دهد.

در انگلیسی به این خطا syntax error (سینتکس ارور) گفته می‌شود. در فارسی با نام‌های خطای گرامری، خطای دستوری یا خطای نوشتاری کد نیز شناخته می‌شود.

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

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

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

2-خطای منطقی (Logical Error)

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

خطای منطقی ،خطایی است که در اثر تغییر در یک منطق موجود در برنامه به وجود می آید. رفع این خطا بسیار سخت است زیرا برای یافتن خطا می بایست آن کد را تست کرد.

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

فرض کنید عمل ضرب برای یک ماشین حساب را نوشته‌اید. در سورس برنامه به جای عمگر × از عملگر + استفاده کرده‌اید. کد به درستی اجرا می‌شود ولی نتیجه‌ای که در انتها داریم صحیح نیست.

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

3-خطای استثنا یا خطای زمان اجرا (Run-Time Error)

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

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

فرض کنید در حایی از برنامه کاریر باید یک عدد وارد کند اما داده متنی وارد میکند.

در حقیقت کدما هیچ ایرادی نداشته، بلکه در هنگام اجرا، شرایطی پیش آمده که باعث Run Time Error شده است.

سایر خطاهای برنامه نویسی

در بحث خطا یابی در c# میتوان به خطاهای زیر نیز اشاره کرد.

خطای منبع (Resource Error)

هر برنامه‌ای برای اجرا به منابع مختلفی نیاز دارد. این منبع می‌تواند قدرت پردازشی CPU، میزان فضای RAM یا حتی دستگاه‌های بیرونی (مثل پرینتر یا Wi-Fi) باشد.

اگر منابعی که به برنامه داده شده است کافی نباشد، معمولاً برنامه ما درخواست منابع بیشتراز سیستم عامل خواهد کرد.

اگر سیستم عامل منابع بیشتری دراختیار نداشته باشد یامقدار بیشتری از آنرا در اختیار برنامه قرار ندهد، باخطای resource مواجه میشویم.

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

خطای واسط (Interface Error)

نرم‌افزارها و حتی سخت‌افزارها برای تعامل با هم از واسط (اینترفیس یا interface) استفاده می‌کنند. تعریف واسط بحث مفصلی است که می‌توانید در مورد آن در برنامه‌نویسی شئ‌گرا بیشتر بخوانید.

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

برطرف کردن خطاها

در بحث خطا یابی در c# مهمترین قسمت برطرف کردن خطاهاست

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

هنگامی که شما با ماوس روی این خطوط توقف کنید توضیحات خطا را مشاهده می‌کنید.

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

همانطور که در میدانید هرگاه برنامه شما با خطا مواجه شود لیست خطاها در Error List نمایش داده می‌شود.

ستونتوضیحات
Descriptionتوضیحی درباره خطا
Fileفایلی که خطا در آن اتفاق افتاده است
Lineشماره خطی از فایل که دارای خطاست
Columnستون یا موقعیت افقی خطا در داخل خط
Projectنام پروژه‌ای که دارای خطاست.

Debug کردن برنامه با Visual Studio

خطا یابی در c# را با ابزارهای خطا یاب ادامه میدهیم.

ویژوال استودیو یک IDE بسیار قدرتمند برای توسعه و برنامه نویسی همه برنامه ها از نوع دسکتاپ/وب میباشد. یکی از ویژگی بسیار مهمی که در ویژوال استودیو وجود دارد قابلیت و امکان debug کردن برنامه ها است.

چیست ؟

اگر میخواهید هنگامیکه برنامه را در IDE ویژوال استودیو اجرا میشود، نحوه ی عملکرد یک تابع یا قطعه کدی مشخص را بررسی کنید از breakpoint استفاده میکنید.

بنابراین با استفاده از breakpoint برنامه را اجرا میکنید برنامه در مکانی که breakpoint قرار دارد می ایستد و منتظر می ماند و شما میتوانید برنامه خود را در این مرحله از اجرا مشاهده کنید و مقادیر آنها را بررسی کنید. این قابلیت مهمترین مزیت و کاربرد breakpoint میباشد.

اضافه کردن یک breakpoint معمولی به برنامه

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

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

اضافه کردن یک Breakpoint شرطی به برنامه

اضافه کردن یک breakpoint
اضافه کردن یک breakpoint

همان طوری که در قسمت قبل توضیح دادیم اگر breakpoint را بر روی یک loop تنظیم کنیم برنامه بدون هیچ شرطی در مکان موردنظر شما متوقف میشود. اما اگر بخواهید که برای breakpoint شرط بگذارید. به روش های زیر میتوانید عمل کنید :

1.در منوی context  روی breakpoint  کلیک راست کنید  و گزینه ی “Conditions…” را انتخاب کنید.

2.ویژوال استودیو برای تنظیم شرط (شرایط) پنجره ی “Breakpoint Settings” را به کاربران خود پیشنهاد میدهد.

.در این قسمت میخواهیم شرط مورد نظر خود را به گونه ای تنظیم کنیم که اگر شمارنده (i) بزرگتر از 5 بود breakpoint به برنامه اعمال شود و اگر کوچکتر از 5  بود breakpoint به برنامه اعمال نخواهد شد.

در بعضی از موارد شما نیاز دارید که برنامه را براساس یک id یا thread id بررسی کنید. ویژوال استودیو در این موارد نیز آپشن هایی را در اختیار شما قرار داده است.

در بعضی از موارد شما نیاز دارید که به تعداد دفعات مشخصی برنامه اجرا شود در این موارد از “Hit count” استفاده میکنیم. برای استفاده از این قابلیت گزینه ی “Hit Count” را از لیست زیر انتخاب کنید.

اضافه کردن Actions

پنجره “Breakpoint Settings” نیز log message را در پنجره خروجی نمایش میدهد که با استفاده از آنها میتوانید از “Actions” استفاده کنید. در این قسمت کلمات کلیدی مخصوص وجود دارد که هر کدام از آنها در  “Action” text box معنی خاص خود را دارند.

هنگامیکه گزینه Action را انتخاب میکنید و تیک checkbox با نام “Continue execution” را انتخاب میکنید، breakpoint هنگام اجرا عمل نخواهد کرد و شما میتوانید پیام مربوطه را در “Output Window” مشاهده کنید.

غیرفعال کردن Breakpiont ها

در بعضی موارد، شما میخواهید اجرای برنامه بدون اینکه breakpoint اعمال شود، ادامه پیدا کند ، اما در دفعات بعدی نیاز دارید که از این breakpoint ها استفاده کنید.

در این مواقع میتوانید از گزینه “Disable Breakpoint” با استفاده از کلید میانبر “Ctrl + F9” استفاده کنید.

در دفعات بعدی که میخواهید از breakpoint استفاده کنید میتوانید با استفاده از کلید میانبر گفته شده ، breakpoint ها را فعال کنید. شما میتوانید از این عملیات ها در زمان اجرای برنامه استفاده کنید.

منوی debug در ویژوال استودیو

منوی debug در ویژوال استودیو
نوی debug در ویژوال استودیو

اجرای تک‌ مرحله‌ای

یکی از بزرگ‌ترین ابزارهای هر زبان برنامه‌نویسی توانایی اجرای «گام به گام» (step through) کد است. این قابلیت امکان تماشای برنامه را در زمان اجرا و به صورت هر بار یک خط فراهم می‌سازد.

برای استفاده از این قابلیت باید مکانی را که می‌خواهید کد مکث کند مشخص کنید. این کار با تعیین «نقطه توقف» (breakpoint) انجام می‌یابد. نقطه توقف اساساً یک فلگ است که به VS Code اعلام می‌کند باید در آن نقطه از کد توقف کند.

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

برای تعیین نقطه توقف، روی حاشیه سمت چپ کد و اعداد خطوط کلیک کنید. برای نمونه برای تعیین یک نقطه توقف در ابتدای تابع ()addNumbers در کنار خط 2 که به صورت زیر است کلیک کنید:

var numberA = document.getElementById("numA").value;

اکنون یک دایره قرمز می‌بینید که در کنار خطی که نشانه‌گذاری کرده‌اید نمایان می‌شود:

حذف نقاط توقف

برای حذف یک نقطه توقف، روی دایره قرمز کلیک کنید.

برخلاف برخی محیط‌های توسعه دیگر، VS Code امکان درج نقطه توقف را در هر کجا می‌دهد حتی می‌توان در اعلان متغیر، کامنت و یا خطوط خالی نیز نقطه توقف تعریف کرد. با این وجود در اعلان تابع (برای مثال در خط 1 نمونه کد فوق) امکان تعیین نقطه توقف وجود ندارد.

اکنون برنامه خود را در حالت دیباگ اجرا کنید (مسیر Debug→Start Debugging را از منو انتخاب کنید یا دکمه F5 را بزنید).

با فرض این که از پروژه نمونه معرفی شده استفاده می‌کنید و یا اگر از پروژه خود استفاده می‌کنید، در صورتی که فایل json. را به درستی پیکربندی کرده باشید، VS Code کروم را اجرا می‌کند و صفحه را نمایش می‌دهد.

در ماشین حساب نادرست، همه چیز به صورت نرمال آغاز به کار می‌کند، اما زمانی که روی دکمه Add Numbers کلیک کنیم، VS Code با نقطه توقف تعیین شده مواجه می‌شود و اجرای کد را متوقف می‌کند.

در اغلب موارد (و نه همه آن‌ها)، VS Code سایه‌ای روی پنجره مرورگر قرار داده و یک پیام زردرنگ نمایش می‌دهد که نشانگر توقف اجرای کد از سوی نقطه توقف است.

اینک زمان آن رسیده است با بخث خطا یابی در c# به ویرایشگر VS Code بازگردیم.

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

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

دستور Continue (با میانبر F5)

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

دستور Step Over (با میانبر F11)

دستور Step Over یک گام منفرد را اجرا می‌کند. بدین ترتیب خطی که هم اینک هایلایت شده است اجرا خواهد شد و سپس مجدداً متوقف می‌شود. اگر آن را روی مثال مورد بررسی اجرا کنید، VS Code خط 2 را اجرا می‌کند و مقدار را از کادر متنی اول می‌گیرد. سپس درست پیش از اجرای خط 3 متوقف می‌شود. این همان خطی است که برای دریافت مقدار از کادر متنی دوم طراحی شده است. اینک VS Code در خط 3 متوقف شده است.

اکنون با زدن F11 می‌توانید گام دیگری بردارید و همین طور تا آخر بروید تا این که همه تابع را به صورت خط به خط اجرا کنید.

واژه Over در نام این دستور Step Over به معنی روش کار این دستور با فراخوانی‌های تابع است. اگر یک خط کد را که یک تابع را فراخوانی می‌کند، Step Over کنید، VS Code کل تابع را اجرا می‌کند و در خط زیر آن متوقف می‌شود.

دستور Step Into (با میانبر F10)

دستور Step Into عملکردی مشابه Step Over دارند به جز این که وقتی با یک تابع برخورد می‌کند رفتار متفاوتی دارد. در این حالت دستور Step Into وارد آن تابع می‌شود و در خط نخست آن متوقف می‌شود.

نکته اینجا است که دستور Step Into زمانی کار می‌کند که آن تابع بخشی از کد شما باشد. شما نمی‌توانید درون چیزی مانند تابع ()getElementById به صورت Step Into بروید، زیرا بخش داخلی مدل صفحه وب مرورگر است.

در واقع در این مثال هیچ تفاوتی بین استفاده از دستورهای Step Into و Step Over وجود ندارد. اما اگر می‌خواهید تابعی بنویسید که تابع دیگری را فراخوانی می‌کند، می‌توانید از Step Into برای انتقال به مکانی در آن کد استفاده کنید و بدین ترتیب هیچ جزییاتی از دست نمی‌رود.

start debug
start debug

دستور Step Out (با میانبر Shift+F11)

خطا یابی در c# را بادستور Step Out ادامه میدهیم.

دستور Step Out همه کدهایی را که در تابع کنونی قرار دارند اجرا می‌کند و سپس در خط بعدی متوقف می‌شود. به بیان دیگر این گزاره امکان خروج از تابع کنونی را در یک گام فراهم می‌سازد.

منوی debug
منوی debug

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا