پرش به محتوای اصلی
رزرو مشاوره تلفنی تک جلسه‌ای با استاد رضوی
رزرو مشاوره تلفنی
کنکور کامپیوتر
0
اشتراک
 

مدیریت استثنا یا Exception Handling در برنامه نویسی چیست

این صفحه عالی توضیح داده که مدیریت استثنا یا Exception Handling در برنامه نویسی چیست و نحوه مدیریت استثنا ها در زبان های برنامه نویسی را بیان کرده است

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

تابلوی مثلث خطر با عنوان Exception Handling

استثنا یا Exception به دلایل مختلفی به‌وجود می‌آید. در زیر برخی از موارد پدید آمدن استثنا را مشاهده می‌کنید:

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

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

استثناها چگونه مدیریت می‌شوند؟

فرض کنید یک برنامه از تعداد زیادی عبارت (Statement) تشکیل شده باشد. اگر در وسط کد یک استثنایی رخ دهد، عبارت‌های بعد از استثنا دیگر اجرا نخواهند شد و در واقع برنامه کرش می‌کند و از اجرا می‌ایستد. برای جلوگیری از این اتفاق، استثناها باید مدیریت شوند. استثناها می‌توانند Catch شوند. Catch به‌معنی گرفتن است، در واقع وقتی استثنایی رخ دهد، بلوک catch که در اکثر زبان‌های برنامه‌نویسی وجود دارد، آن استثنای به‌وجود آمده یا به‌اصطلاح پرتاب شده (Throw) را می‌گیرد. به‌وسیله کدهای نوشته شده در قسمت catch، قادر هستیم تا استثناهای به‌وجود آمده را مدیریت و کنترل کنیم. پارامترهای مربوط به بلاک catch، می‌توانند نوع استثنا را نیز مشخص کنند؛ به‌عنوان مثال آیا استثنا از نوع تقسیم بر 0 است؟ آیا تلاش برای دسترسی به فایلی که وجود ندارد است؟ و...

قسمت دیگری که در برنامه‌نویسی برای مدیریت استثنا وجود دارد، بلوک try است، آن قسمت از کدهایی که ممکن است منجر به ایجاد استثنا شوند، باید داخل بلوک try نوشته شوند تا بتوان در صورت ایجاد استثنا آن را کنترل کرد؛ بنابراین بلوک try کدهایی که مستعد ایجاد استثنا هستند را در خود جا می‌دهد. در صورت ایجاد شدن یک استثنا بلوک catch اجرا می‌شود اما اگر استثنایی ایجاد نشد، کدهای catch اجرا نخواهند شد. همانطور که در تصویر زیر مشخص است، در بلوک try یک استثنا شناسایی (Detect) می‌شود و به بلوک catch پرتاب (Throw) می‌شود تا مدیریت شود.

نحوه مدیریت استثنا به وسیله بلوک های try-catch

مدیریت استثنا در زبان های برنامه نویسی

اگرچه ماهیت و عملکرد مدیریت کردن استثناها در زبان‌های برنامه‌نویسی یکسان است اما در نوع پیاده‌سازی و ویژگی آنها کمی با یکدیگر تفاوت دارند؛ به‌عنوان مثال در زبان برنامه نویسی C  بلوک catch all وجود دارد که امکان گرفتن انواع استثناها در آن وجود دارد. این قابلیت در زبان برنامه نویسی جاوا وجود ندارد یا به‌عنوان مثالی دیگر در زبان C++‎ می‌توان علاوه بر آبجکت‌ها، اشاره‌گر یا Pointer هم به بلوک catch فرستاد در حالی که در زبان‌های دیگر مانند جاوا این امر ممکن نیست. برخلاف زبان C++، زبان جاوا علاوه بر بلوک‌های try و catch دارای یک بلوک دیگر با نام finally می‌باشد که چه در صورت شناسایی و یا عدم شناسایی یک استثنا اجرا می‌شود. (البته بلوک finally قرار است از زبان جاوا حذف شود.) در برنامه نویسی پایتون بلوکی به نام 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 می‌خواهیم بررسی کنیم آیا کد به‌طور کامل اجرا می‌شود یا خیر.

نتیجه اجرای کدی که دارای استثنای Division by Zero بود که پس از اجرای آن پیغام Caught Exception نمایش داده می‌شود.

همانطور که در تصویر بالا مشخص است، استثنا مدیریت شده و پیام Caught exception نمایش داده شده است؛ همچنین بعد از تشخیص استثنا، پیام After exception نیز چاپ شده که نشان‌دهنده این است که کدهای بعد از استثنا نیز عملکرد صحیحی دارند. اکنون می‌خواهیم کد بالا را بدون بلوک‌های try و catch اجرا کنیم:

print("Code started here")
 
numerator = 10
denominator = 0
result = numerator / denominator
print("Result:", result)
 
print("After exception");

با اجرای دستور بالا نتیجه به‌صورت زیر می‌شود:

 نتیجه اجرای کدی که دارای استثنای ZeroDivisionError است و پس از اجرای آن برنامه متوقف شده است

همانطور که مشخص است یک ZeroDivisionError رخ داده است و برنامه متوقف شده است و دیگر خبری از پیام After exception نیست زیرا برنامه تا استثنا اجرا شده است و بعد از آن دیگر اجرا نشده است.

انواع استثناها کدامند؟

به‌طور کلی 2 نوع استثنا وجود دارد:

  • Checked Exception: این نوع استثنا که به‌اصطلاح به آن استثنا زمان کامپایل یا Compile-Time Exception می‌گویند در زمان کامپایل کردن توسط کامپایلر (Compiler) شناسایی می‌شود و در صورت شناسایی یک خطا در سیستم نمایش داده می‌شود. استثناهایی مانند ClassNotFoundException و SQLException از این نوع استثنا هستند.
  • Unchecked Exception: این نوع استثنا که به آن Runtime Exception یا استثنای زمان اجرا می‌گویند توسط کامپایلر بررسی نمی‌شود و خود برنامه‌نویس وظیفه مدیریت کردن آن را دارد زیرا این نوع استثنا در زمان اجرای کد ایجاد می‌شود. استثناهایی مانند NullPointerException و IllegalArgumentException از این نوع استثنا هستند.

نمونه هایی از استثناهای معروف

تعداد استثناهایی که ممکن است در زمان اجرای برنامه ایجاد شوند نسبتا زیاد است؛ اما بعضی از این استثناها معروف هستند و در موارد زیادی ممکن است ایجاد شوند و شما به‌عنوان یک برنامه‌نویس می‌بایست نحوه مدیریت کردن آن را بلد باشید. در لیست زیر تعدادی از این استثناها آمده است:

  • ClassNotFoundException: این استثنا زمانی ایجاد می‌شود که برنامه‌نویس درخواست کلاسی را می‌کند که وجود ندارد. ممکن است نام کلاس اشتباهی وارد شده باشد و یا مسیر دسترسی به کلاس صحیح نباشد.
  • NullPoinerException: یک استثنای Unchecked است و زمانی رخ می‌دهد که کاربر بخواهد به یک آبجکت از طریق یک متغیر مرجع یا Reference Variable دسترسی پیدا کند که خالی یا Null است.
  • IllegalArgumentException: به‌طور ساده این استثنا زمانی ایجاد می‌شود که یک آرگومان ناصحیح به یک متد داده شود. فرضا اگر ورودی متد یک متغیر از جنس Int باشد و ما یک String به آن بدهیم، این استثنا ایجاد می‌شود.
  • SQLException: این استثنا مربوط به سینتکس پایگاه داده‌های SQL می‌شود و در زمان اجرای یک کوئری بر روی دیتابیس ایجاد می‌شود.
  • ArrayIndexOutOfBoundsException: این استثنا زمانی ایجاد می‌شود که ما بخواهیم به اندیسی از آرایه که وجود ندارد دسترسی پیدا کنیم؛ مثلا اگر آرایه name دارای طول 5 باشد و ما بخواهیم به name[20] دسترسی پیدا کنیم این استثنا ایجاد می‌شود.
  • DivideByZeroException: همانطور که بالاتر این استثنا را باهم بررسی کردیم، این استثنا زمانی ایجاد می‌شود که در عملگر تقسیم، مخرج ما عدد صفر باشد.
  • FileNotFoundException: زمانی ایجاد می‌شود که ما قصد دسترسی به فایلی را داشته باشیم که وجود ندارد.
  • StackOverflowError: از استثناهای مهلک است و دلیل ایجاد آن مصرف بالای حافظه به‌دلایلی مثل توابع بازگشتی می‌باشد.

جمع‌بندی

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

استثناها (Exceptions) چگونه مدیریت می‌شوند؟

ساده‌ترین راه برای مدیریت کردن استثناها استفاده از بلوک try-catch است. کدهایی که مستعد ایجاد استثنا هستند را درون بلوک try می‌نویسیم و مدیریت کردن استثنا در صورت ایجاد را در بلوک catch پیاده‌سازی می‌کنیم.

آیا استثنا همانند باگ‌های نرم‌افزاری هستند؟

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

این مطلب چقدر به کارت آمد؟511111111115.00 از ۵ 2 رأی
اشتراک
تلگرام اینستاگرام تماس با پشتیبانی: 09378555200 تماس با پشتیبانی: 09378555200
خدمات ما
پشتیبانی کنکور کامپیوتر

سؤالی داری؟ از ۸ صبح تا ۱۰ شب پاسخ‌گوییم.

تماس با پشتیبانی۰۹۳۷۸۵۵۵۲۰۰ پشتیبانی در تلگرامپاسخ‌گویی پیامی کانال تلگراماخبار و اطلاعیه‌ها اینستاگرامkonkurcomputer.ir
اشتراک‌گذاری این مطلب

مدیریت استثنا یا Exception Handling در برنامه نویسی چیست

تلگرام واتس‌اپ ایکس
https://www.konkurcomputer.ir/مدیریت-استثنا-یا-exception-handling-چیست.html
خدمات کنکور کامپیوتر
هر چیزی که برای قبولی لازم داری، یک‌جاخدمات ما

از مشاوره‌ی شخصی با استاد رضوی تا فیلم‌های دروس، پلتفرم‌ها و ابزارهای رایگان

مشاوره‌ی شخصی با استاد رضوی
تماس با پشتیبانی