في درس اليوم سنتعرف على الاستثناءات. ما هي الاستثناءات؟ حسنًا، إنها أحداث استثنائية. إنه حدث يحدث أثناء تنفيذ البرنامج. وما يفعله هو أنه يعطل التدفق الطبيعي لتعليمات البرنامج. وعندما يحدث هذا الخطأ داخل طريقة، الطريقة تنشيء كائن، وتقوم بتسليمه لنظام التشغيل. هذا الكائن الذي يسمى كائن الاستثناء Exception Object، يحتوي على معلومات حول الخطأ، بما في ذلك نوع وحالة البرنامج متى حدث الخطأ. إنشاء كائن استثناء والتعامل معه لنظام التشغيل، يُعرف بإلقاء الاستثناء. في الأيام الماضية، سيقوم البرنامج بإنتاج نظام تفريغ لذاكرته. الآن بعد أن قامت إحدى الطرق بإلقاء استثناء، يحاول نظام وقت التشغيل العثور على شيء للتعامل معه. مجموعة الأشياء الممكنة للتعامل مع الاستثناء، هي القائمة المرتبة بالطرق التي تم استدعاؤها، للحصول على الطريقة التي حدث بها الخطأ. لماذا نستخدم الاستثناءات؟ حسنًا، ما نريد فعله هو فصل كود معالجة الخطأ عن الكود العادي. تسمح لنا الاستثناءات بفصل تفاصيل ما يجب القيام به عندما يحدث شيء خارج عن المألوف، ونفصل ذلك عن المنطق الرئيسي للبرنامج. يجعل الكود الخاص بنا أسهل في القراءة. تشمل أنواع الاستثناءات، ماذا يحدث إذا كان الملف الذي نحاول أن نفتحه، لا يمكن فتحه؟ ماذا يحدث إذا تعذر تحديد طول الملف؟ ماذا يحدث إذا لم يكن هناك ذاكرة كافية ليتم تخصيصها؟ ماذا يحدث إذا فشلت القراءة؟ ماذا يحدث إذا تعذر إغلاق الملف؟ بدون الاستثناءات، سيتعين علينا خلط رمز معالجة الخطأ مع الكود الذي يؤدي بالفعل منطق البرنامج. لذا نفتح الملف، إذا تم فتح الملف، فنحدد طول الملف. إذا كان طول الملف جيدًا، فنخصص هذا القدر من الذاكرة. إذا كانت لدينا ذاكرة كافية، فإننا نقرأ الملف. كما ترى، هناك الكثير من اكتشاف الأخطاء داخل الكود، مما يجعل الكود يصبح طويلاً، ويصعب متابعته، مع سلسلة من عبارات if المتداخلة. عندما يكون هناك الكثير من التحقق من الأخطاء داخل الشفرة، نفقد مسار التدفق المنطقي للشفرة، ويجعل من الصعب تصحيح الأخطاء، وتفهم بالضبط ما تفعله الشفرة. يمكننا تجميع أنواع الأخطاء والتمييز بينها، ولأن جميع الاستثناءات التي تم طرحها داخل البرنامج هي كائنات، يصبح التجميع سهلاً، وهي نتيجة طبيعية للتسلسل الهرمي للفئة التي بنيت عليها Java. يمكن للطريقة التقاط استثناء بناءً على مجموعتها، أو النوع العام، من خلال تحديد أي من الاستثناءات فئات السوبر في بيان الالتقاط Catch. وسنلقي نظرة على عبارة try catch بعد ذلك. لكن يجب أن تكون معالجات الاستثناء محددة قدر الإمكان. في تحديد نوع الاستثناء، قبل اتخاذ قرار بشأن أفضل استراتيجية للتعافي. من خلال عدم اكتشاف أخطاء معينة، يجب أن تستوعب المعالجات أي احتمال. وإذا كان لدينا معالجات استثناء عامة جدًا، يمكن أن تجعل الشفرة أكثر عرضة للخطأ، عن طريق التقاط الاستثناءات والتعامل معها التي لم يتوقعها المبرمج، ولهذا لم يكن المقصود من المعالج الاستثناء هو نوع من الحدث. يحدث أثناء تشغيل البرنامج، ويوقف التدفق الطبيعي للبرنامج. عند حدوث الخطأ، تقوم الطريقة بإنشاء كائن، وتسليمه لنظام التشغيل. هناك الكثير من الأشياء التي تحدث خلف الكواليس، ولكن يمكننا التعامل مع هذه الاستثناءات، وإنتاج بعض المخرجات التي تشرح ما يحدث. الآن، هناك مجموعة من الاستثناءات المحتملة المختلفة، ويمكننا التعامل مع كل واحد منهم، وما سنراه، هو كيفية التعامل مع الاستثناء الذي نعلم أنه قد يحدث. يمكن أن تفصل الاستثناءات تفاصيل ما يجب القيام به عندما يحدث شيء خارج عن المألوف، وتبقيه بعيدًا عن المنطق الرئيسي للبرنامج. ولأن كل هذه الاستثناءات كائنات، يمكننا تجميعها أو تصنيفها، بحيث يكون لها معنى. عندما نكتب هذه الاستثناءات، نريد أن نكون محددين قدر الإمكان. ودعنا نلقي نظرة على ما أتحدث عنه بالضبط. سأقوم بالتمرير لأسفل، وهنا برنامجنا. إنه برنامج بسيط، أقوم بإنشاء عدد صحيح، يسمى القسمة على صفر، وقد أعددته على أنه يساوي صفر. ثم لديّ كتلة جرب والتقط Try Catch تبدأ في السطر 45. الفكرة هنا أنه قبل أن أقسم على صفر، ستختبر لمعرفة ما إذا كانت عملية التقسيم ستنجح. إذا كان هناك استثناء حسابي، سيطبع الاستثناء الحسابي، ورسالة عما كنت أحاول القيام به. ثم كتلة Finally تقول، هذا سيحدث مهما حدث. لنقم بتشغيل هذا البرنامج ونرى ما سيحدث. الآن في المرة الأولى التي أشغله فيها، عمل بشكل مثالي، لأن القسمة على صفر تساوي خمسة على واحد. ما يحدث هو أنني إذا غيرت الواحد إلى صفر، وأحاول القسمة على الصفر، هذا هو سطر الكود الذي سوف يولد الاستثناء. سيحاول البرنامج القيام بالتقسيم. عندما يحدث الاستثناء، يلتقط هذا الاستثناء الحسابي، ثم يطبع الرسالة. دعنا نقوم بتشغيله ونرى ما سيحدث. حاولنا القسمة على صفر وخمسة على صفر. اكتشف البرنامج خطأنا وقال، الاستثناء الحسابي بصفر هو المشكلة. وأخيرًا، يتم دائمًا تنفيذ كتلة التعليمات البرمجية، ولم يتغير متغير القسمة على الصفر. ما المهم أن تعرفه هنا، هو أن البرنامج قد اكتمل بنجاح، والمطبوعات (النواتج) هي الشيء الذي يجب مراجعته لمعرفة الخطأ الذي قد يحدث. الآن أنت تعرف كيف يمكن التعامل مع الاستثناءات قبل أن يتسببوا في مشكلة في برنامجك.