.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)
تعليقات
إرسال تعليق