
مقدمه: چرا در سی شارپ و 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”);
}
با استفاده از این ابزارها، میتوانید لاگهای جامعی از استثناهای رخداده در برنامه خود داشته باشید و فرآیند عیبیابی را تسهیل کنید.
نتیجهگیری : آیا واقعا مدیریت استثناها ضرورت دارد؟
مدیریت صحیح استثناها در سیشارپ نه تنها از بروز خطاهای غیرمنتظره جلوگیری میکند، بلکه به بهبود تجربه کاربری و پایداری نرمافزار کمک میکند.
با پیادهسازی بهترین شیوهها و استفاده از ابزارهای مناسب، میتوانید نرمافزارهایی قابل اعتماد و کارآمد توسعه دهید.
📢 اگر شما هم تجربه ای در کدنویسی با مدیریت استثناها را دارید در بخش کامنتها آن را به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید