مدیریت استثنا به فرآیندی اشاره دارد که به بررسی و حل استثناهای ناخواسته و یا غیر قابل انتظاری که باعث بهوجود آمدن مشکلاتی در سیستمهای کامپیوتری میشود میپردازد. با مدیریت کردن صحیح استثناها، از بهوجود آمدن اختلال و بهاصطلاح کرش کردن سیستم در آینده جلوگیری میکنیم. بدون مدیریت کردن استثناها، عملکرد یک برنامه مختل شده و از حالت عادی خارج میشود.
استثنا یا Exception به دلایل مختلفی بهوجود میآید. در زیر برخی از موارد پدید آمدن استثنا را مشاهده میکنید:
- ناصحیح بودن ورودی کاربر
- خطاهای کدنویسیکدنویسی چیست؟ – کد نویسی یعنی چهاین مقاله عالی به بررسی این پرداخته که کد نویسی چیست و مفهوم کد نویسی را بررسی کرده، همچنین تفاوت کدنویسی و برنامه نویسی و کاربرد های کدنویسی را بررسی کرده
- پدید آمدن مشکل در دستگاهها و سخت افزارسخت افزار چیست - بررسی اجزای اصلی سخت افزار کامپیوتردر این صفحه بررسی شده که سخت افزار چیست و سخت افزار کامپیوتر به زبان ساده معرفی شده است، همچنین به بررسی اجزای اصلی سخت افزار کامپیوتر پرداخته شده استها
- قطع شدن اتصال به اینترنت
- نداشتن حافظه کافی برای اجرای نرمافزار
- تداخلات حافظهای دو یا چند برنامه با یکدیگر
- تقسیم یک عدد بر صفر
- باز کردن و یا تلاش برای استفاده از فایلی که وجود ندارد
- و...
زمانی که یک استثنا رخ داد، ساختارهای نوشته شده توسط زبان های برنامه نویسیزبان های برنامه نویسی چیست؟این مقاله عالی توضیح داده که زبان های برنامه نویسی چیست؟ و انواع زبان های برنامه نویسی و بهترین زبان برنامه نویسی برای شروع و پردرآمدترین آنها را معرفی کرده، یک وقفه سخت افزاری (Interrupt) بهوجود میآورند و بهوسیله امکانات موجود در OS یا سیستم عاملسیستم عامل چیست به زبان ساده، چرا باید از OS استفاده کنیم؟این مقاله عالی به معرفی سیستم عامل (Operating System|OS) به زبان ساده پرداخته، همچنین بررسی کرده که چرا باید از سیستم عامل استفاده کنیم ، این استثنا مدیریت میشود. توجه کنید که استثنا با باگمعنی باگ چیست | باگ یعنی چه؟ | انواع باگ های نرم افزاریاین مقاله عالی به توضیح معنی باگ (bug)، معرفی انواع باگ های نرم افزاری، توضیح آنکه چگونه از پدید آمدن باگ جلوگیری کنیم؟ و در نهایت نحوه رفع باگ پرداخته و خطا در برنامه نویسیبرنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟در عصر فعلی برنامهنویسی یکی از پرطرفدارترین شغلهای دنیاست، دغدغهای افرادی که میخواهند در مسیر برنامهنویس شدن قدم بردارند این است که نمیدانند از کجا باید شروع کنند، در این صفحه هر آن چه برای تبدیل شدن به یک برنامه نویس حرفه ای نیاز دارید در اختیارتان قرار گرفته است تفاوت دارد. بههمین منوال مدیریت استثنا با اشکال زدایی (Debugging)دیباگ چیست؟ معرفی روشها و ابزارهای دیباگینگ(اشکال زدایی)این مقاله عالی مفاهیم دیباگ (debug)، دیباگینگ (Debugging) یا همان اشکال زدایی، دیباگر (Debugger) را معرفی و همچنین روشها و ابزارهای دیباگینگ را بررسی کرده فرق میکند و هدف این دو حوزه کاملا مستقل از یکدیگر است.
استثناها چگونه مدیریت میشوند؟
فرض کنید یک برنامه از تعداد زیادی عبارت (Statement) تشکیل شده باشد. اگر در وسط کد یک استثنایی رخ دهد، عبارتهای بعد از استثنا دیگر اجرا نخواهند شد و در واقع برنامه کرش میکند و از اجرا میایستد. برای جلوگیری از این اتفاق، استثناها باید مدیریت شوند. استثناها میتوانند Catch شوند. Catch بهمعنی گرفتن است، در واقع وقتی استثنایی رخ دهد، بلوک catch که در اکثر زبانهای برنامهنویسی وجود دارد، آن استثنای بهوجود آمده یا بهاصطلاح پرتاب شده (Throw) را میگیرد. بهوسیله کدهای نوشته شده در قسمت catch، قادر هستیم تا استثناهای بهوجود آمده را مدیریت و کنترل کنیم. پارامترهای مربوط به بلاک catch، میتوانند نوع استثنا را نیز مشخص کنند؛ بهعنوان مثال آیا استثنا از نوع تقسیم بر 0 است؟ آیا تلاش برای دسترسی به فایلی که وجود ندارد است؟ و...
قسمت دیگری که در برنامهنویسی برای مدیریت استثنا وجود دارد، بلوک try است، آن قسمت از کدهایی که ممکن است منجر به ایجاد استثنا شوند، باید داخل بلوک try نوشته شوند تا بتوان در صورت ایجاد استثنا آن را کنترل کرد؛ بنابراین بلوک try کدهایی که مستعد ایجاد استثنا هستند را در خود جا میدهد. در صورت ایجاد شدن یک استثنا بلوک catch اجرا میشود اما اگر استثنایی ایجاد نشد، کدهای catch اجرا نخواهند شد. همانطور که در تصویر زیر مشخص است، در بلوک try یک استثنا شناسایی (Detect) میشود و به بلوک catch پرتاب (Throw) میشود تا مدیریت شود.
مدیریت استثنا در زبان های برنامه نویسی
اگرچه ماهیت و عملکرد مدیریت کردن استثناها در زبانهای برنامهنویسی یکسان است اما در نوع پیادهسازی و ویژگی آنها کمی با یکدیگر تفاوت دارند؛ بهعنوان مثال در زبان برنامه نویسی Cزبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح میدهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C میپردازد بلوک catch all وجود دارد که امکان گرفتن انواع استثناها در آن وجود دارد. این قابلیت در زبان برنامه نویسی جاواجاوا چیست؟ تعریف، معنی و ویژگی های جاوا (java) از 0تا100جاوا یک زبان برنامه نویسی همه منظوره، مبتنی بر کلاس و شی گرا است که برای داشتن وابستگی های پیاده سازی کمتر طراحی شده است، زبان برنامه نویسی جاوا شبیه ++C است وجود ندارد یا بهعنوان مثالی دیگر در زبان C++برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده میتوان علاوه بر آبجکتها، اشارهگر یا Pointer هم به بلوک catch فرستاد در حالی که در زبانهای دیگر مانند جاوا این امر ممکن نیست. برخلاف زبان C++، زبان جاوا علاوه بر بلوکهای try و catch دارای یک بلوک دیگر با نام finally میباشد که چه در صورت شناسایی و یا عدم شناسایی یک استثنا اجرا میشود. (البته بلوک finally قرار است از زبان جاوا حذف شود.) در برنامه نویسی پایتونزبان برنامه نویسی پایتون چیست؟ – نحوه شروع و دلایل محبوبیتزبان برنامه نویسی پایتون (Python) چیست؟ این مقاله عالی به بررسی دلایل محبوبیت پایتون، موارد استفاده از پایتون و نحوه شروع به برنامه نویسی پایتون پرداخته بلوکی به نام catch وجود ندارد و در عوض از واژه except برای مدیریت استثنا استفاده میشود.
نمونه کدنویسی مدیریت استثنا در زبان های مختلف
در این قسمت میخواهیم یک نمونه ساده از مدیریت استثنا در 4 زبان برنامه نویسی C++ ،C# ،Java و پایتون را با هم بررسی کنیم. در سورس کد (Source Code)سورس کد چیست؟ آیا سورس کد یا سورس برنامه قابلیت اجرا دارند؟این مقاله عالی به سورس کد یا سورس برنامه پرداخته؛ همچنین به بررسی اهداف سورس کد، نحوه ساخت سورس کد و اینکه آیا سورس کد ها قابلیت اجرا دارند پرداخته زیر متغیر numerator از جنس عدد صحیح (Integer) و نماینده صورت کسر است که برابر مقدار 10 میباشد، همچنین متغیر denominator عدد مخرج است که یک متغیر دیگر از جنس عدد صحیح میباشد که مقدار آن 0 است. متغیر result یک متغیر دیگر از جنس Integer است و میخواهیم حاصل تقسیم numerator بر denominator را در آن ذخیره کنیم. همانطور که پیشتر گفته شد، تقسیم یک عدد بر 0 باعث ایجاد یک استثنا (Divided by Zero) میشود بنابراین این قسمت از کد باید داخل بلوک try نوشته شود تا در صورت ایجاد استثنا برنامه ما متوقف نشود.
کد مدیریت استثنا به زبان C++
#include <iostream>
int main() {
try {
int numerator = 10;
int denominator = 0;
int result = numerator / denominator;
std::cout << "Result: " << result << std::endl;
} catch (const std::exception& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
} catch (...) {
std::cerr << "Caught an unknown exception." << std::endl;
}
return 0;
}
کد مدیریت استثنا به زبان Java
public class TryCatchExample {
public static void main(String[] args) {
try {
int numerator = 10;
int denominator = 0;
int result = numerator / denominator;
System.out.println("Result: " + result);
} catch (ArithmeticException e) {
System.err.println("Caught exception: " + e.getMessage());
} catch (Throwable t) {
System.err.println("Caught an unknown exception.");
}
}
}
کد مدیریت استثنا به زبان C#
using System;
class TryCatchExample
{
static void Main()
{
try
{
int numerator = 10;
int denominator = 0;
int result = numerator / denominator;
Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Caught exception: " + ex.Message);
}
catch
{
Console.WriteLine("Caught an unknown exception.");
}
}
}
کد مدیریت استثنا به زبان Python
try:
numerator = 10
denominator = 0
result = numerator / denominator
print("Result:", result)
except ZeroDivisionError as e:
print("Caught exception:", str(e))
except:
print("Caught an unknown exception.")
اجرای یک نمونه مثال
بیایید یک نمونه اجرای کد را با و بدون مدیریت کردن استثنا بررسی کنیم. کد زیر را در نظر بگیرید:
print("Code started here")
try:
numerator = 10
denominator = 0
result = numerator / denominator
print("Result:", result)
except ZeroDivisionError as e:
print("Caught exception:", str(e))
except:
print("Caught an unknown exception.")
print("After exception");
همانطور که مشاهده میکنید از بلوکهای try و catch استفاده شده است؛ همچنین قبل و بعد از این بلوکها با استفاده از دستور print میخواهیم بررسی کنیم آیا کد بهطور کامل اجرا میشود یا خیر.
همانطور که در تصویر بالا مشخص است، استثنا مدیریت شده و پیام Caught exception نمایش داده شده است؛ همچنین بعد از تشخیص استثنا، پیام After exception نیز چاپ شده که نشاندهنده این است که کدهای بعد از استثنا نیز عملکرد صحیحی دارند. اکنون میخواهیم کد بالا را بدون بلوکهای try و catch اجرا کنیم:
print("Code started here")
numerator = 10
denominator = 0
result = numerator / denominator
print("Result:", result)
print("After exception");
با اجرای دستور بالا نتیجه بهصورت زیر میشود:
همانطور که مشخص است یک ZeroDivisionError رخ داده است و برنامه متوقف شده است و دیگر خبری از پیام After exception نیست زیرا برنامه تا استثنا اجرا شده است و بعد از آن دیگر اجرا نشده است.
انواع استثناها کدامند؟
بهطور کلی 2 نوع استثنا وجود دارد:
- Checked Exception: این نوع استثنا که بهاصطلاح به آن استثنا زمان کامپایل یا Compile-Time Exception میگویند در زمان کامپایل کردن توسط کامپایلر (Compiler)کامپایلر چیست و چگونه کار میکند و چرا از آن استفاده میشود؟کامپایلر (Compiler) یک برنامهی خاص برای ترجمه سورس کدهای (Source Code) یک زبان برنامه نویسی، به زبان ماشین یا بایت کد و یا یک زبان برنامه نویسی دیگر است شناسایی میشود و در صورت شناسایی یک خطا در سیستم نمایش داده میشود. استثناهایی مانند ClassNotFoundException و SQLException از این نوع استثنا هستند.
- Unchecked Exception: این نوع استثنا که به آن Runtime Exception یا استثنای زمان اجرا میگویند توسط کامپایلر بررسی نمیشود و خود برنامهنویس وظیفه مدیریت کردن آن را دارد زیرا این نوع استثنا در زمان اجرای کد ایجاد میشود. استثناهایی مانند NullPointerException و IllegalArgumentException از این نوع استثنا هستند.
نمونه هایی از استثناهای معروف
تعداد استثناهایی که ممکن است در زمان اجرای برنامه ایجاد شوند نسبتا زیاد است؛ اما بعضی از این استثناها معروف هستند و در موارد زیادی ممکن است ایجاد شوند و شما بهعنوان یک برنامهنویس میبایست نحوه مدیریت کردن آن را بلد باشید. در لیست زیر تعدادی از این استثناها آمده است:
- ClassNotFoundException: این استثنا زمانی ایجاد میشود که برنامهنویس درخواست کلاسی را میکند که وجود ندارد. ممکن است نام کلاس اشتباهی وارد شده باشد و یا مسیر دسترسی به کلاس صحیح نباشد.
- NullPoinerException: یک استثنای Unchecked است و زمانی رخ میدهد که کاربر بخواهد به یک آبجکت از طریق یک متغیر مرجع یا Reference Variable دسترسی پیدا کند که خالی یا Null است.
- IllegalArgumentException: بهطور ساده این استثنا زمانی ایجاد میشود که یک آرگومان ناصحیح به یک متد داده شود. فرضا اگر ورودی متد یک متغیر از جنس Int باشد و ما یک String به آن بدهیم، این استثنا ایجاد میشود.
- SQLException: این استثنا مربوط به سینتکس پایگاه دادهپایگاه داده چیست؟ – انواع، مفاهیم و کاربردهاپایگاه داده چیست؟ این مقاله به بررسی این موضوع و همچنین انواع پایگاه داده، کاربردهای پایگاه داده، محبوب ترین پایگاه های داده و اجزای اصلی پایگاه داده پرداخته های SQL میشود و در زمان اجرای یک کوئری بر روی دیتابیس ایجاد میشود.
- ArrayIndexOutOfBoundsException: این استثنا زمانی ایجاد میشود که ما بخواهیم به اندیسی از آرایه که وجود ندارد دسترسی پیدا کنیم؛ مثلا اگر آرایهآموزش آرایه در ساختمان داده به زبان ساده و از 0 تا 100در این مقاله موارد زیر بررسی شده است : 1- آرایه چیست 2- انواع اندیس گذاری در آرایه 3- انواع آرایه 4- محاسبه آدرس در آرایه 5- محاسبه شماره در آرایه 6- آرایه در برنامه نویسی 7- مزایای استفاده از آرایه name دارای طول 5 باشد و ما بخواهیم به name[20] دسترسی پیدا کنیم این استثنا ایجاد میشود.
- DivideByZeroException: همانطور که بالاتر این استثنا را باهم بررسی کردیم، این استثنا زمانی ایجاد میشود که در عملگر تقسیم، مخرج ما عدد صفر باشد.
- FileNotFoundException: زمانی ایجاد میشود که ما قصد دسترسی به فایلی را داشته باشیم که وجود ندارد.
- StackOverflowError: از استثناهای مهلک است و دلیل ایجاد آن مصرف بالای حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روشهای آدرس دهی کش، نگاشت آدرس و موارد دیگر میپردازیم بهدلایلی مثل توابع بازگشتی میباشد.
جمعبندی
بحث استثناها همیشه در برنامهنویسی وجود داشته است و از دیرباز جزء یکی از دغدغههای برنامهنویسان بوده است. یادگیری در مورد انواع استثناها و مدیریت کردن آن یکی از ملزمات برنامهنویسی است؛ چرا که در صورت عدم کنترل صحیح آن، برنامه از اجرا میایستد و عملکرد برنامه مختل میشود. در این مقاله بهطور مفصل در مورد استثناها بحث کردیم و نمونهای از آن را در زبانهای برنامهنویسی مختلف نشان دادیم؛ همچنین توضیحاتی در مورد مهمترین و معروفترین استثناها نیز تهیه کردیم.
استثناها (Exceptions) چگونه مدیریت میشوند؟
سادهترین راه برای مدیریت کردن استثناها استفاده از بلوک try-catch است. کدهایی که مستعد ایجاد استثنا هستند را درون بلوک try مینویسیم و مدیریت کردن استثنا در صورت ایجاد را در بلوک catch پیادهسازی میکنیم.
آیا استثنا همانند باگهای نرمافزاری هستند؟
خیر. مفهوم استثنا بهطور کلی با باگ فرق دارد. باگها به دلایل کدنویسی ایجاد میشوند و در بدنه کد وجود دارند و با دیباگ کردن و رفع باگ از بین میروند. اما استثنا به ورودی کاربران و عملکرد برنامه بستگی دارد و وقوع آن قابل پیشگیری نیست بلکه باید مدیریت شود تا عملکرد برنامه مختل نشود.