آشنایی با استثناءها به ما اطمینان میدهد که خطاهای مرتبط را در هنگام وقوع شناسایی و مدیریت کنیم.
توضیح:
۱- کدهای درج شده در این مقاله به زبان #C هستند.
۲- این مقاله نیازمند آشنایی با مباحث برنامهنویسی است.
۳- با وجود اینکه کدها برای یک ویندوزاپلکیشین فرضی نگارش شدهاند اما میتوان همین کدها را برای وباپلیکیشنها نیز به کار گرفت.
۴- استثناء و مدیریت آن، مبحثی مفصل و بسیار کاربردی بوده و درک آن نیازمند چندین مقاله اختصاصی است. با این حال پس مطالعه این مقاله کوتاه میتوان به صورت ابتدایی به مدیریت استثناءها پرداخت.
در یک سناریوی فرضی، فرمی ساده حاوی یک لیبل (Label) برای نمایش پیام خطا، یک فیلد متنی (TextBox) و یک کلید (Botton) را در نظر بگیرید. این فرم قرار است سن کاربر گرفته و بررسی نماید. اگر سن کاربر کمتر از ۲۰ باشد به او اجازه ثبتنام داده میشود در غیر این صورت این امکان وجود نخواهد داشت.
از کاربر درخواست میشود سن خود را در فیلد وارد نموده و در ادامه روی کلید، کلیک کند. در رخداد کلیک مربوط به کلید، مقدار وارد شده در تکستباکس را در یک متغیر ریخته و با عدد ۲۰ مقایسه میکنیم.
از آنجا که مقدار ورودی در تکستباکس از نوع رشته (String) است. متغییری از نوع رشته تعریف کرده و مقدار ورودی را در آن میریزم. سپس با تبدیل آن به متغیری از نوع عدد صحیح (int)، آن را با عدد ۲۰ مقایسه میکنیم.
در حالت عمومی این سناریو بدون مشکل بوده و برنامه به راحتی اجرا میشود. اما اگر ورودی کاربر چیزی به غیر عدد باشد در مرحله تبدیل ورودی به عدد، خطایی رخ میدهد که برای نرمافزار قابل پیشبینی نبوده است.
رفتار پیشفرض در این حالت، بستهشدن (Terminate) نرمافزار است. در این مرحله پای استثناء به مسأله باز میشود. یعنی زمانی که در جریان اجرای یک برنامه، خطا یا اتفاقات غیرمنتظرهای مثل تبدیل یک مقدار غیرمجاز به عدد رخ دهد.
استثناء یک مکانیزم استاندارد برای گزارش وقوع خطاهای زمان اجرا (JIT) در برنامه است. بر همین اساس استفاده از استثناها به ما امکان میدهد که خطاهای رخ داده توسط اعضایی مانند متدهای سازنده را که نوع خاصی را برنمیگردانند نیز مدیریت کنیم.
برای مدیریت استثناءها از بلاککدهای try-catch استفاده میشود.
بدین صورت که کدهایی که ممکن است حاوی خطاهای پیشبینی نشده باشد را در بلاک try قرار داده و رفتار اپلکیشین در صورت وقوع خطا را در بلاک catch قرار میدهیم.
برای مثال اگر قرار باشد با استفاده از بلاککدهای try-catch مانع از وقوع خطای ذکر شده در سناریوی بالا شویم به صورت زیر عمل میکنیم:
//.کدها در رخداد کلیک، کلید قرار میگیرند
bool DataControl = false;
string UserInput = string.empty;
int UserAge = 0;
UserInput = txtUserInput.text;
try {
//.کدهایی که مستعد وقوع خطاهای استثناء هستند در این بلاک قرار میگیرند
UserAge = int.parse(UserInput);
DataControl = true;
}
catch {
//.رفتار اپلیکیشن هنگام وقوع خطا در این بلاک قرار میگیرد
lblError.text = “.ورودی نامعتبر است. ورودی باید عدد باشد”;
DataControl = false;
}
finally {
if (DataControl) {
if (UserAge < 20) {
// .اگر سن کاربر کمتر از ۲۰ باشد این قطعه اجرا میشود
}
else
{
// .اگر سن کاربر بیشتر از از ۲۰ باشد این قطعه اجرا میشود
}
}
}
در این قطعه کد، پس از کلیک بر روی کلید، مقدار تکستباکس (txtUserInput) در متغیری با نام UserInput ریخته میشود. سپس مقدار متغیر UserInput به کمک تابع parse به عدد صحیح تبدیل شده و در متغییری با نام UserAge قرار میگیرد.