ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

مدیریت استثناها در سی‌شارپ: راهنمای جامع و بهترین شیوه‌ها

مقدمه: چرا در سی شارپ و ASP.NET CORE، مدیریت استثناها اهمیت دارد؟

مدیریت استثناها در سی‌شارپ (#C) یکی از مباحث کلیدی در توسعه نرم‌افزار است که به برنامه‌نویسان امکان می‌دهد خطاهای زمان اجرا را به‌طور مؤثر کنترل و مدیریت کنند.

با استفاده از تکنیک‌های مناسب، می‌توان از بروز خطاهای غیرمنتظره جلوگیری کرده و تجربه کاربری بهتری ارائه داد.

اگر می خواهید با شیوهای کدنویسی تمیز در سی شارپ آشنا بشید پیشنهاد می شود نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

مفاهیم پایه در مدیریت استثناها

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

برای مدیریت این شرایط، از ساختارهای try, catch و finally استفاده می‌شود.

✅ ساختار try-catch

بلوک try شامل کدی است که ممکن است منجر به بروز استثنا شود.

در صورت وقوع استثنا، کنترل برنامه به بلوک catch منتقل می‌شود که وظیفه مدیریت استثنا را بر عهده دارد.

				
					try
{
    // Code RunTime Mostaed Error
}
catch (Exception ex)
{
    // Modiriate Error
    Console.WriteLine(ex.Message);
}

				
			

✅ بلوک finally

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

				
					try
{
    // Code RunTime Mostaed Error
}
catch (Exception ex)
{
    // Modiriate Error
}
finally
{
    // Code ke dar har hallati Run mishan
}

				
			

انواع استثناهای رایج در سی‌شارپ

در سی‌شارپ، استثناهای متعددی وجود دارند که برنامه‌نویسان باید با آن‌ها آشنا باشند:

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

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

✅ استفاده از چندین بلوک catch

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

				
					try
{
    // Code ke mitoone Error Bede
}
catch (FormatException ex)
{
    // Modiriate Error Format
}
catch (IOException ex)
{
    // Modiriate Error IO
}
catch (Exception ex)
{
    // Modiriate Any Error
}

				
			

✅ ایجاد استثناهای سفارشی

در صورت نیاز، می‌توان استثناهای سفارشی ایجاد کرد:

				
					public class CustomException : Exception
{
    public CustomException(string message) : base(message)
    {
    }
}

				
			

✅ ثبت لاگ خطاها

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

✅استفاده از بلوک finally برای آزادسازی منابع

همیشه از بلوک finally برای آزادسازی منابعی مانند فایل‌ها یا اتصالات دیتابیس استفاده کنید تا از نشت منابع جلوگیری شود.

مدیریت استثناها در ASP.NET Core

در برنامه‌های ASP.NET Core، می‌توان با استفاده از Middleware سفارشی، استثناها را به‌صورت متمرکز مدیریت کرد:

				
					public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ExceptionHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        context.Response.StatusCode = 500;
        return context.Response.WriteAsync("Internal Server Error");
    }
}

				
			

سوالات متداول درباره مدیریت استثناها در سی‌شارپ و ASP Core

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

try
{
// کد مستعد بروز استثنا
}
catch (FormatException ex)
{
// مدیریت استثنای فرمت
}
catch (IOException ex)
{
// مدیریت استثنای ورودی/خروجی
}
catch (Exception ex)
{
// مدیریت سایر استثناها
}

در این ساختار، ابتدا استثناهای خاص‌تر و در نهایت استثنای عمومی‌تر (Exception) قرار می‌گیرند.

بلوک finally بخشی از ساختار مدیریت استثنا است که همیشه، چه استثنا رخ دهد و چه ندهد، اجرا می‌شود.

این بلوک معمولاً برای آزادسازی منابعی مانند بستن فایل‌ها یا اتصالات به پایگاه داده استفاده می‌شود.

try
{
// کد مستعد بروز استثنا
}
catch (Exception ex)
{
// مدیریت استثنا
}
finally
{
// آزادسازی منابع
}

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

public class CustomException : Exception
{
public CustomException(string message) : base(message)
  {
  }
}

سپس می‌توانید این استثنا را در کد خود پرتاب (throw) کرده و در بلوک‌های catch مربوطه مدیریت کنید.

برای مدیریت استثناهای مدیریت‌نشده در برنامه‌های کنسولی، می‌توانید رویداد UnhandledException را در ابتدای برنامه ثبت کنید:

AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
Console.WriteLine($”Unhandled Exception: {((Exception)args.ExceptionObject).Message}”);
};

 

در برنامه‌های ASP.NET Core، می‌توانید از Middleware سفارشی برای مدیریت استثناها استفاده کنید.

در سی‌شارپ، می‌توانید بلوک‌های try-catch را به‌صورت تودرتو (Nested) استفاده کنید.

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

try
{
try
{
// کد مستعد بروز استثنا
}
catch (NullReferenceException ex)
{
// مدیریت استثنای NullReferenceException
}
}
catch (Exception ex)
{
// مدیریت سایر استثناها
}

برای ثبت و پیگیری استثناها، می‌توانید از کتابخانه‌های لاگ‌گیری مانند Serilog یا NLog استفاده کنید.

این ابزارها امکان ثبت جزئیات استثناها، از جمله پیام خطا، نوع استثنا و ردیابی پشته (Stack Trace) را فراهم می‌کنند که برای عیب‌یابی مفید است.

try
{
// کد مستعد بروز استثنا
}
catch (Exception ex)
{
logger.Error(ex, “An error occurred”);
}

 

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

نتیجه‌گیری : آیا واقعا مدیریت استثناها ضرورت دارد؟

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

با پیاده‌سازی بهترین شیوه‌ها و استفاده از ابزارهای مناسب، می‌توانید نرم‌افزارهایی قابل اعتماد و کارآمد توسعه دهید.

📢 اگر شما هم تجربه ای در کدنویسی با مدیریت استثناها را دارید در بخش کامنت‌ها آن را به اشتراک بگذارید! 🚀

میثم راد

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

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

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