.NET Core - التعامل مع الأخطاء (Exception Handling)

6.3 .NET Core - التعامل مع الأخطاء (Exception Handling)

أي تطبيق معرض للأخطاء أثناء التشغيل مثل: أخطاء في قاعدة البيانات، أو Null Reference، أو مدخلات غير صحيحة. في ASP.NET Core، يمكنك التعامل مع هذه الأخطاء بطريقة مركزية وآمنة باستخدام Middleware مخصص أو الأدوات المدمجة.


🔹 الطرق الشائعة للتعامل مع الأخطاء

  • استخدام try-catch داخل الأكشن.
  • استخدام Middleware مخصص للتعامل مع الأخطاء عالميًا.
  • استخدام ExceptionHandler Middleware الرسمي من ASP.NET Core.

🔹 الطريقة البسيطة: try-catch


[HttpGet("{id}")]
public IActionResult Get(int id)
{
    try
    {
        var product = GetProductById(id);
        return Ok(product);
    }
    catch (Exception ex)
    {
        return StatusCode(500, $"خطأ: {ex.Message}");
    }
}

🔸 جيدة للسيناريوهات البسيطة، لكنها مملة ومكررة في المشاريع الكبيرة.

🔹 الطريقة الاحترافية: Middleware للتعامل مع الأخطاء

📄 إنشاء Middleware مخصص:


public class ErrorHandlerMiddleware
{
    private readonly RequestDelegate _next;

    public ErrorHandlerMiddleware(RequestDelegate next) => _next = next;

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = 500;
            context.Response.ContentType = "application/json";

            var result = new
            {
                Message = "حدث خطأ غير متوقع.",
                Error = ex.Message
            };

            await context.Response.WriteAsJsonAsync(result);
        }
    }
}

🧩 التسجيل في Program.cs:


app.UseMiddleware<ErrorHandlerMiddleware>();

🔹 الطريقة الرسمية: UseExceptionHandler

يمكنك استخدام الـ Middleware المدمج في ASP.NET Core:


app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        context.Response.StatusCode = 500;
        context.Response.ContentType = "application/json";

        var error = context.Features.Get<IExceptionHandlerPathFeature>();
        if (error != null)
        {
            await context.Response.WriteAsJsonAsync(new
            {
                Message = "خطأ داخلي في الخادم.",
                Error = error.Error.Message
            });
        }
    });
});

🔹 نصائح إضافية

  • لا تعرض رسائل الخطأ التفصيلية في بيئة الإنتاج.
  • سجّل الأخطاء في ملف أو قاعدة بيانات باستخدام Logger.
  • استخدم StatusCodes مناسبة (400 - 404 - 500).

🔹 الخلاصة

التعامل مع الأخطاء بشكل مركزي باستخدام Middleware يجعل الكود أنظف وأكثر احترافية. ويساعد على حماية التطبيق من الأعطال غير المتوقعة، مع تقديم رسائل مناسبة للمستخدم.

تعليقات

المشاركات الشائعة من هذه المدونة

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

Entity Framework - مقدمة عن Entity Framework