021-88881776

آموزش مدیریت استثناها (Exception Handling) در سی شارپ

در دنیای برنامه‌نویسی، آموزش C# و یادگیری مفاهیم پایه و پیشرفته این زبان برای هر برنامه‌نویسی ضروری است. یکی از مفاهیم مهم در برنامه‌نویسی زبان سی شارپ، مدیریت استثناها (Exception Handling) است که به برنامه‌نویسان این امکان را می‌دهد که خطاهای احتمالی را پیش‌بینی کرده و به طور مؤثر با آن‌ها برخورد کنند. در این مقاله، به تفصیل به بررسی مدیریت استثناها (Exception Handling) در سی شارپ می‌پردازیم و تمامی جنبه‌های این موضوع را از سطح مبتدی تا پیشرفته توضیح خواهیم داد. این مقاله شامل توضیحات کامل و مثال‌های عملی برای درک بهتر مفهوم مدیریت استثناها در سی شارپ است.

مدیریت استثناها (Exception Handling)

مدیریت استثناها در سی شارپ به مجموعه‌ای از تکنیک‌ها گفته می‌شود که به برنامه‌نویس این امکان را می‌دهند که در مواجهه با خطاها و استثناهای احتمالی در هنگام اجرای برنامه، واکنش‌های مناسبی داشته باشد. این تکنیک‌ها معمولاً با استفاده از دستورات خاصی مانند try, catch, و finally انجام می‌شود. با استفاده از مدیریت استثناها می‌توان از کرش (crash) کردن برنامه جلوگیری کرده و تجربه کاربری بهتری فراهم آورد.

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

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

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

انواع رایج استثناها:

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

DivideByZeroException: زمانی که برنامه تلاش می‌کند یک عدد را بر صفر تقسیم کند.
NullReferenceException: زمانی که برنامه تلاش می‌کند به یک شیء null دسترسی پیدا کند.
FileNotFoundException: زمانی که برنامه به فایلی دسترسی پیدا می‌کند که وجود ندارد.
IndexOutOfRangeException: زمانی که یک برنامه تلاش می‌کند به اندیسی از یک آرایه یا لیست دسترسی پیدا کند که خارج از محدوده معتبر است.
InvalidOperationException: زمانی که عملیات غیرمجاز یا نادرستی انجام می‌شود.

دلایل وقوع استثنا:

استثناها می‌توانند به دلایل مختلف رخ دهند، که مهم‌ترین آن‌ها عبارتند از:

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

استثناها در سی شارپ:

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

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

مدیریت استثناها:

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

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

مثال ساده از وقوع استثنا:

try
{
    int result = 10 / 0; // تقسیم بر صفر
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("خطا: نمی‌توان بر صفر تقسیم کرد.");
}

در این مثال، یک استثنا از نوع DivideByZeroException ایجاد می‌شود چون برنامه سعی می‌کند ۱۰ را بر صفر تقسیم کند. با استفاده از دستور catch، این استثنا به درستی مدیریت شده و پیامی به کاربر نمایش داده می‌شود که از وقوع خطا آگاه شود.استثناها در برنامه‌نویسی به عنوان یک مکانیزم مهم برای شناسایی و مدیریت خطاها عمل می‌کنند. در زبان سی شارپ، این استثناها به راحتی از طریق دستورات try, catch, و finally قابل مدیریت هستند، و به این ترتیب برنامه‌نویسان می‌توانند خطاهای احتمالی را شناسایی کرده و از بروز مشکلات جدی در برنامه جلوگیری کنند.

استفاده از دستورات try, catch, finally

برای مدیریت استثناها در سی شارپ، از سه دستور اصلی به نام‌های try, catch, و finally استفاده می‌شود که هرکدام وظیفه خاص خود را در فرآیند مدیریت خطا و استثنا بر عهده دارند. این دستورات به برنامه‌نویس این امکان را می‌دهند که به‌طور مؤثر با شرایط غیرمنتظره در کدهای خود برخورد کرده و برنامه‌ای پایدار و بدون خطا ایجاد کنند.

دستور try

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

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

دستور catch

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

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

دستور finally

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

دستور finally به ویژه زمانی مفید است که بخواهید مطمئن شوید منابعی که در ابتدا باز شده‌اند، بسته می‌شوند، یا عملیات cleanup بعد از عملیات اصلی انجام شود.

مثال 1: استفاده از دستورات try, catch, finally

try
{
    int result = 10 / 0; // تلاش برای تقسیم بر صفر
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("خطا: نمی‌توان بر صفر تقسیم کرد.");
}
finally
{
    Console.WriteLine("این کد در هر صورت اجرا می‌شود.");
}

در این مثال:

بلوک try حاوی کدی است که ممکن است استثنا تولید کند. در اینجا، تلاش می‌کنیم عدد ۱۰ را بر صفر تقسیم کنیم که این عمل یک استثنا از نوع DivideByZeroException ایجاد می‌کند.
بلوک catch استثنای تولید شده را گرفته و آن را مدیریت می‌کند. در اینجا، پیام خطایی به کاربر نمایش داده می‌شود که نشان می‌دهد نمی‌توان بر صفر تقسیم کرد.
بلوک finally در انتها اجرا می‌شود و پیامی را نمایش می‌دهد که حتی اگر استثنایی رخ داده باشد یا رخ نداده باشد، اجرا خواهد شد. این دستور معمولاً برای انجام عملیات cleanup استفاده می‌شود.

نکات مهم در استفاده از try, catch, finally:

ترتیب دستورات: ترتیب دستورات مهم است. همیشه ابتدا باید دستور try را نوشته و سپس دستور catch و در نهایت دستور finally (در صورت نیاز) را قرار دهید. اگر finally قبل از catch قرار بگیرد، کامپایلر خطا خواهد داد.

چندین بلوک catch: شما می‌توانید چندین بلوک catch داشته باشید تا استثناهای مختلف را به‌طور جداگانه مدیریت کنید. این ویژگی به شما این امکان را می‌دهد که بسته به نوع استثنا، واکنش‌های مختلفی داشته باشید.

استفاده از finally برای پاکسازی منابع: در صورتی که منابعی مانند فایل‌ها یا اتصالات شبکه را در برنامه خود باز کرده‌اید، باید از بلوک finally برای بستن آن‌ها استفاده کنید تا حتی اگر استثنایی رخ دهد، منابع به درستی آزاد شوند.

استثناهای عمومی: در صورتی که نخواهید یا نتوانید همه استثناهای خاص را شناسایی کنید، می‌توانید از بلوک catch عمومی به شکل catch(Exception ex) استفاده کنید تا همه استثناهای غیرمنتظره را مدیریت کنید.

مثال 2: مدیریت چندین نوع استثنا

try
{
    string[] arr = new string[] { "a", "b", "c" };
    int index = 5;
    Console.WriteLine(arr[index]); // دسترسی به اندیسی خارج از محدوده آرایه
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("خطا: دسترسی به اندیسی خارج از محدوده آرایه.");
}
catch (Exception ex)
{
    Console.WriteLine("خطای عمومی: " + ex.Message);
}
finally
{
    Console.WriteLine("این کد در هر صورت اجرا می‌شود.");
}

در این مثال:

تلاش می‌کنیم به اندیسی خارج از محدوده آرایه دسترسی پیدا کنیم که موجب بروز استثنا از نوع IndexOutOfRangeException می‌شود.
در بلوک catch اول این نوع استثنا را مدیریت می‌کنیم.
اگر استثنای دیگری رخ دهد، آن را در بلوک catch عمومی می‌گیریم.
در نهایت، بلوک finally اجرا می‌شود که در اینجا به کاربر اطلاع می‌دهد که این بخش از کد در هر صورت اجرا می‌شود.
استفاده از دستورات try, catch, و finally در سی شارپ یکی از روش‌های اساسی و حیاتی برای مدیریت استثناها و خطاهای احتمالی در برنامه‌ها است. این دستورات به شما کمک می‌کنند که برنامه‌تان در برابر خطاها مقاوم‌تر باشد و از بروز مشکلات جدی جلوگیری کنید. علاوه بر این، استفاده صحیح از دستور finally می‌تواند تضمین کند که منابع به درستی مدیریت شده و برنامه به درستی تمیزکاری می‌شود.

استثناهای خاص در C# و نحوه مدیریت آن‌ها

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

1. DivideByZeroException

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

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

مثال:

try
{
    int result = 10 / 0; // تلاش برای تقسیم بر صفر
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("خطا: نمی‌توان بر صفر تقسیم کرد.");
}

در این مثال، کد تلاش می‌کند عدد ۱۰ را بر صفر تقسیم کند که یک استثنا از نوع DivideByZeroException به وجود می‌آید. این استثنا در دستور catch مدیریت می‌شود و پیامی به کاربر نمایش داده می‌شود.

2. NullReferenceException

استثنا NullReferenceException زمانی رخ می‌دهد که برنامه تلاش می‌کند به یک شیء null دسترسی پیدا کند. این استثنا معمولاً زمانی رخ می‌دهد که یک شیء به درستی مقداردهی نشده است، اما برنامه قصد دارد به آن دسترسی پیدا کند یا از آن استفاده کند.

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

مثال:

try
{
    string text = null;
    Console.WriteLine(text.Length); // تلاش برای دسترسی به شیء null
}
catch (NullReferenceException ex)
{
    Console.WriteLine("خطا: شیء مورد نظر null است.");
}

در این مثال، وقتی تلاش می‌شود به شیء null دسترسی پیدا کرده و طول آن را دریافت کنیم، استثنا از نوع NullReferenceException ایجاد می‌شود. دستور catch این استثنا را مدیریت کرده و پیامی به کاربر نمایش می‌دهد.

3. FileNotFoundException

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

نحوه مدیریت:
برای جلوگیری از بروز این استثنا، می‌توانید قبل از دسترسی به فایل، با استفاده از متد File.Exists وجود آن را بررسی کنید و در صورتی که فایل وجود ندارد، پیامی به کاربر نمایش دهید.

مثال:

try
{
    string filePath = "nonexistentFile.txt";
    string fileContent = File.ReadAllText(filePath); // تلاش برای خواندن از فایل غیرموجود
}
catch (FileNotFoundException ex)
{
    Console.WriteLine("خطا: فایل مورد نظر یافت نشد.");
}

در این مثال، کد تلاش می‌کند محتوای فایلی به نام nonexistentFile.txt را بخواند که وجود ندارد. این باعث بروز استثنا از نوع FileNotFoundException می‌شود و دستور catch این استثنا را مدیریت می‌کند.

4. IndexOutOfRangeException

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

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

مثال:

try
{
    string[] arr = { "a", "b", "c" };
    Console.WriteLine(arr[5]); // تلاش برای دسترسی به ایندکسی خارج از محدوده
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("خطا: دسترسی به ایندکسی خارج از محدوده آرایه.");
}

در این مثال، برنامه تلاش می‌کند به ایندکسی از آرایه دسترسی پیدا کند که خارج از محدوده آن است. این باعث بروز استثنا از نوع IndexOutOfRangeException می‌شود که در دستور catch مدیریت می‌شود.

5. ArgumentNullException

استثنا ArgumentNullException زمانی رخ می‌دهد که یک متد یا تابع، آرگومانی از نوع null دریافت کند، در حالی که این آرگومان نباید null باشد. این خطا معمولاً در متدهایی که انتظار دریافت داده معتبر دارند، رخ می‌دهد.

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

مثال:

try
{
    string text = null;
    if (text == null)
    {
        throw new ArgumentNullException("text", "آرگومان نباید null باشد.");
    }
}
catch (ArgumentNullException ex)
{
    Console.WriteLine("خطا: " + ex.Message);
}

در این مثال، یک شیء null به نام text تعریف شده و بررسی می‌شود که آیا null است یا خیر. اگر این آرگومان null باشد، یک استثنا از نوع ArgumentNullException پرتاب می‌شود و پیام خطا به کاربر نمایش داده می‌شود.

6. InvalidOperationException

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

نحوه مدیریت:
برای جلوگیری از بروز این استثنا، باید ابتدا بررسی کنید که آیا عملیات مورد نظر بر روی شیء امکان‌پذیر است یا خیر.

مثال:

try
{
    Stack<int> stack = new Stack<int>();
    stack.Pop(); // تلاش برای خارج کردن یک عنصر از پشته خالی
}
catch (InvalidOperationException ex)
{
    Console.WriteLine("خطا: عملیات نامعتبر.");
}

در این مثال، برنامه تلاش می‌کند از یک پشته خالی یک عنصر خارج کند که باعث بروز استثنا از نوع InvalidOperationException می‌شود.
در زبان سی شارپ، انواع مختلفی از استثناها وجود دارند که می‌توان آن‌ها را شناسایی و به صورت مؤثر مدیریت کرد. استثناهایی مانند DivideByZeroException, NullReferenceException, FileNotFoundException و سایر استثناها، به دلایل مختلف می‌توانند در هنگام اجرای برنامه رخ دهند. مدیریت این استثناها از طریق دستورات try, catch, و finally به شما این امکان را می‌دهد که به‌طور دقیق و ایمن به مشکلاتی که ممکن است در طول اجرای برنامه پیش بیایند، واکنش نشان دهید و تجربه کاربری بهتری برای کاربران برنامه خود فراهم کنید.

ایجاد استثناهای سفارشی با استفاده از کلاس‌های Exception در C#

در زبان سی شارپ، علاوه بر استثناهای پیش‌فرض که در هنگام بروز خطاهای رایج توسط سیستم ایجاد می‌شوند (مانند DivideByZeroException، NullReferenceException، و غیره)، شما می‌توانید استثناهای سفارشی (Custom Exceptions) نیز ایجاد کنید. این استثناها زمانی مفید هستند که بخواهید خطاهایی خاص مربوط به منطق برنامه خود را شبیه‌سازی و مدیریت کنید.

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

نحوه ایجاد استثناهای سفارشی در C#

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

مراحل ایجاد استثنا سفارشی:

تعریف کلاس جدید: کلاسی جدید تعریف کنید که از کلاس Exception ارث‌بری کند.
تعریف سازنده (Constructor): سازنده‌ای برای این کلاس تعریف کنید که پیام خطا یا هر اطلاعات اضافی مورد نیاز را به کلاس پایه (کلاس Exception) منتقل کند.
پرتاب استثنا (Throwing the Exception): از دستور throw برای پرتاب استثنای سفارشی در برنامه استفاده کنید.
مدیریت استثنا (Catching the Exception): استثنا را با استفاده از دستور catch مدیریت کنید.

مثال 1: ایجاد یک استثنا سفارشی ساده

در این مثال، یک استثنا به نام MyCustomException ایجاد می‌شود که از کلاس Exception ارث‌بری می‌کند و در داخل برنامه پرتاب می‌شود. سپس این استثنا در بلوک catch مدیریت می‌شود.

public class MyCustomException : Exception
{
    // سازنده برای انتقال پیام خطا به کلاس پایه (Exception)
    public MyCustomException(string message) : base(message)
    {
    }
}

try
{
    // پرتاب استثنا سفارشی
    throw new MyCustomException("این یک استثنا سفارشی است.");
}
catch (MyCustomException ex)
{
    // مدیریت استثنا سفارشی
    Console.WriteLine("استثنا سفارشی: " + ex.Message);
}

توضیحات:
در ابتدا، کلاسی به نام MyCustomException ایجاد شده که از کلاس Exception ارث‌بری می‌کند.
سازنده این کلاس یک آرگومان از نوع string به نام message دریافت می‌کند که به سازنده کلاس پایه Exception ارسال می‌شود. این پیام خطا در هنگام پرتاب استثنا در اختیار برنامه‌نویس قرار می‌گیرد.
در داخل بلوک try, استثنای MyCustomException پرتاب می‌شود.
بلوک catch این استثنا را شناسایی کرده و پیامی را به کاربر نشان می‌دهد.

افزودن ویژگی‌های اضافی به استثناهای سفارشی

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

برای مثال، می‌توانید ویژگی‌هایی مانند کد خطا، تاریخ و زمان بروز خطا یا هر اطلاعات دیگری را به استثناهای خود اضافه کنید.

مثال 2: افزودن ویژگی‌های اضافی به استثنا سفارشی

public class MyCustomException : Exception
{
    public int ErrorCode { get; }
    public DateTime ErrorTime { get; }

    // سازنده برای انتقال پیام خطا و ویژگی‌های اضافی
    public MyCustomException(string message, int errorCode) 
        : base(message)
    {
        ErrorCode = errorCode;
        ErrorTime = DateTime.Now;
    }
}

try
{
    // پرتاب استثنا سفارشی با ویژگی‌های اضافی
    throw new MyCustomException("خطای بحرانی در پردازش داده‌ها.", 1001);
}
catch (MyCustomException ex)
{
    // مدیریت استثنا سفارشی و نمایش ویژگی‌های اضافی
    Console.WriteLine($"استثنا سفارشی: {ex.Message}");
    Console.WriteLine($"کد خطا: {ex.ErrorCode}");
    Console.WriteLine($"زمان خطا: {ex.ErrorTime}");
}

توضیحات:
در این مثال، کلاس MyCustomException دارای دو ویژگی اضافی به نام‌های ErrorCode (کد خطا) و ErrorTime (زمان خطا) است.
وقتی استثنا پرتاب می‌شود، علاوه بر پیام خطا، کد خطا و زمان بروز خطا نیز به استثنا ارسال می‌شود.
در بلوک catch، علاوه بر پیام خطا، ویژگی‌های اضافی نیز نمایش داده می‌شوند.

استفاده از استثناهای سفارشی در برنامه‌های پیچیده

استثناهای سفارشی می‌توانند به‌ویژه در برنامه‌های پیچیده یا برنامه‌هایی که با سیستم‌های خارجی (مانند پایگاه‌های داده، API ها، یا سیستم‌های فایل) تعامل دارند، بسیار مفید باشند. شما می‌توانید استثناهایی ایجاد کنید که برای شناسایی و مدیریت خطاهای خاص برنامه شما طراحی شده‌اند.

برای مثال، در برنامه‌هایی که با بانک اطلاعاتی کار می‌کنند، ممکن است بخواهید استثنای سفارشی ایجاد کنید که به خطاهای خاص مربوط به پایگاه داده اشاره کند:

مثال 3: ایجاد استثنای سفارشی برای خطای پایگاه داده

public class DatabaseConnectionException : Exception
{
    public string ConnectionString { get; }
    
    public DatabaseConnectionException(string message, string connectionString) 
        : base(message)
    {
        ConnectionString = connectionString;
    }
}

try
{
    // شبیه‌سازی خطای اتصال به پایگاه داده
    throw new DatabaseConnectionException("خطا در اتصال به پایگاه داده", "Server=myServer;Database=myDB;");
}
catch (DatabaseConnectionException ex)
{
    Console.WriteLine($"استثنا پایگاه داده: {ex.Message}");
    Console.WriteLine($"اتصال به پایگاه داده با استفاده از رشته اتصال: {ex.ConnectionString}");
}

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

نتیجه‌گیری

در این مقاله، با مفهوم و نحوه مدیریت استثناها در سی شارپ آشنا شدیم و بررسی کردیم که چگونه می‌توان از دستورات try, catch, و finally برای مدیریت استثناهای رایج استفاده کرد. همچنین، به اهمیت ایجاد استثناهای سفارشی با استفاده از کلاس‌های Exception در سی شارپ پرداختیم و نشان دادیم که چگونه می‌توان با طراحی استثناهای خاص، خطاهای خاص برنامه را به راحتی مدیریت و تشخیص داد.

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

در نهایت، مدیریت استثناها (Exception Handling) در سی شارپ یکی از اجزای حیاتی هر برنامه‌نویسی است که باعث می‌شود برنامه‌ها حتی در مواجهه با شرایط غیرمنتظره، به درستی عمل کنند و تجربه کاربری بهتری را فراهم سازند.

آموزش مدیریت استثناها (Exception Handling) در سی شارپ

دیدگاه های شما

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

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