Flutter Error Handling باستخدام Freezed

x32x01
  • بواسطة x32x01 ||
  • #1
لو بتشتغل بـ Flutter، أكيد قابلت المشكلة دي 😵‍💫
كل شوية try-catch في كل مكان… وكود بدأ يبقى صعب يتقري، أصعب يتصان، ومليان Bugs!
الحقيقة إن هندلة الأخطاء (Error Handling) بالطريقة التقليدية ممكن تتحول لفوضى بسرعة… خصوصًا في المشاريع الكبيرة.
لكن في حل أنضف وأقوى بكتير 👇
باستخدام Freezed + Union Types.

إيه المشكلة في try-catch التقليدية؟​

رغم إن try-catch مهمة، لكن استخدامها العشوائي بيعمل مشاكل زي:
  • ❌ تكرار الكود في كل مكان
  • ❌ نسيان التعامل مع بعض الأخطاء
  • ❌ كود غير منظم ومليان تشعبات
  • ❌ صعوبة اختبار الكود (Testing)
والأسوأ؟
ممكن التطبيق ينهار (Crash) بسبب Error مش معمول له Handling!



الحل: استخدام Freezed وUnion Types​

بدل ما تعتمد على Exceptions، تقدر تستخدم نمط منظم بيسمى Result Pattern.
الفكرة ببساطة:
بدل ما الدالة ترمي Error… هي بترجع نتيجة واحدة من حالتين:
  • ✅ Success → فيها البيانات
  • ❌ Failure → فيها تفاصيل الخطأ
وده بيتعمل باستخدام Freezed.



مثال عملي: إنشاء ApiResult باستخدام Freezed​

كود:
import 'package:freezed_annotation/freezed_annotation.dart';

part 'api_result.freezed.dart';

@freezed
class ApiResult<T> with _$ApiResult<T> {
  const factory ApiResult.success(T data) = Success<T>;
  const factory ApiResult.failure(String message) = Failure<T>;
}
الكلاس ده بقى هو المصدر الوحيد للنتيجة بدل Exceptions.



استخدام ApiResult في API Call​

كود:
Future<ApiResult<List<String>>> fetchUsers() async {
  try {
    final data = await api.getUsers();
    return ApiResult.success(data);
  } catch (e) {
    return ApiResult.failure("حدث خطأ أثناء تحميل البيانات");
  }
}
لاحظ هنا 👀
مفيش رمي Exceptions… كل حاجة راجعة بشكل منظم.



التعامل مع النتيجة باستخدام .when()​

هنا بقى السحر الحقيقي 🔥
كود:
result.when(
  success: (data) {
    print("Data: $data");
  },
  failure: (message) {
    print("Error: $message");
  },
);
الميزة القوية هنا:
  • 🛡️ Compile-time Safety
  • مستحيل تنسى تعالج حالة النجاح أو الفشل
  • الـ IDE هيجبرك تتعامل مع كل الحالات



الدمج مع Clean Architecture وCubit​

لما تستخدم الطريقة دي مع:
  • Clean Architecture
  • Cubit / Bloc
هتحصل على:
  • فصل كامل بين Logic و UI
  • كود قابل للاختبار بسهولة
  • إدارة حالات التطبيق بشكل واضح



ليه الطريقة دي أفضل؟​

✅ كود أنضف وأسهل قراءة​

كل حاجة واضحة… مفيش Exceptions مستخبية.

✅ تقليل الأخطاء المفاجئة​

مفيش Crash بسبب Error مش معمول له Handling.

✅ تحسين تجربة التطوير​

هتشتغل أسرع وهتفهم الكود بسهولة.

✅ قابلية توسع عالية​

تقدر تضيف حالات جديدة زي: Loading - Empty بسهولة جدًا.



مقارنة سريعة​

الطريقةالعيوب
try-catchعشوائية، صعب تتبعها
Freezed + Resultمنظمة، آمنة، واضحة

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

  • استخدم Freezed لكل Responses المهمة
  • متخلطش بين Exceptions وResult Pattern
  • خليك consistent في المشروع كله
  • اربطها مع Cubit أو Bloc عشان أفضل نتيجة



الخلاصة​

لو عايز كود نظيف، آمن، وسهل الصيانة…
ابعد عن try-catch العشوائية وابدأ استخدم: Freezed + Union Types
هتلاحظ فرق كبير في:
  • جودة الكود 💯
  • سرعة التطوير 🚀
  • تقليل الأخطاء 🛡️
وفي النهاية…
الكود النضيف مش رفاهية… ده استثمار في مستقبل مشروعك.
 
مواضيع مشابهة
x32x01
الردود
0
المشاهدات
5
x32x01
x32x01
x32x01
الردود
0
المشاهدات
6
x32x01
x32x01
x32x01
الردود
0
المشاهدات
3
x32x01
x32x01
x32x01
الردود
0
المشاهدات
3
x32x01
x32x01
x32x01
الردود
0
المشاهدات
3
x32x01
x32x01
إحصائيات المنتدى
المواضيع
750
المشاركات
780
الأعضاء
13
آخر عضو مسجل
Mostafa
عودة
أعلى