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

2.2 ‎.NET API - التعامل مع الأخطاء (Exception Handling + Middleware)

عند بناء Web API احترافي، من المهم جدًا التعامل مع الأخطاء بطريقة منظمة وآمنة، بحيث لا يظهر للمستخدم تفاصيل داخلية، ويتم تسجيل الأخطاء لتتبعها لاحقًا.

🧨 ما أنواع الأخطاء الشائعة؟

  • ❌ NullReferenceException
  • ❌ SqlException أو أخطاء قواعد البيانات
  • ❌ UnauthorizedAccessException
  • ❌ ArgumentException عند تمرير قيم غير صحيحة

🔧 طرق التعامل مع الأخطاء

لدينا طريقتان رئيسيتان:

  • ✅ استخدام try-catch داخل الـ Controller أو Service
  • ✅ بناء Global Exception Handling Middleware

📍 مثال باستخدام try-catch

[HttpGet("{id}")]
public IActionResult GetById(int id)
{
    try
    {
        var product = _context.Products.Find(id);
        if (product == null)
            return NotFound("المنتج غير موجود");

        return Ok(product);
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "خطأ أثناء استرجاع المنتج");
        return StatusCode(500, "حدث خطأ داخلي");
    }
}

🧱 إنشاء Middleware للتعامل مع الأخطاء

ننشئ كلاس مخصص:

public class ExceptionMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ExceptionMiddleware> _logger;

    public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "حدث استثناء غير متوقع");
            context.Response.StatusCode = 500;
            context.Response.ContentType = "application/json";

            var error = new { message = "حدث خطأ غير متوقع، الرجاء المحاولة لاحقًا" };
            await context.Response.WriteAsJsonAsync(error);
        }
    }
}

⚙️ تسجيل Middleware في Program.cs

app.UseMiddleware<ExceptionMiddleware>();

يُفضّل تسجيله في البداية قبل باقي الـ Middleware لتغطية كل الأخطاء.

📌 نصائح احترافية

  • ✅ لا تُظهر رسائل الخطأ المفصلة للمستخدم النهائي.
  • ✅ سجّل كل خطأ في ملفات Log أو أدوات مثل Seq و Serilog.
  • ✅ استخدم Middlewares لتوحيد الاستجابة في حالة الخطأ.

💡 أدوات Logging مشهورة

  • 📘 Serilog
  • 📘 NLog
  • 📘 Application Insights (على Azure)

تعليقات

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

C# - Arrays

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

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