English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا المقال، ستتعرف على كيفية استخدام جمل try، except و finally لمعالجة الاستثناءات في برامج بايثون. هذا سيشجعك على كتابة كود نظيف ومرئي وفعال باستخدام بايثون.
لدي بايثون العديدالاستثناءات المدمجة ، عندما تحدث بعض الأخطاء، فإنها تجبر برنامجك على إطلاق رسالة خطأ.
عند حدوث هذه الاستثناءات، فإنها ستؤدي إلى توقف العملية الحالية وإيصالها إلى عملية النداء، حتى يتم معالجتها. إذا لم يتم معالجتها، فإن برنامجنا سيتم تدميره.
على سبيل المثال، إذا قام الدالة A بتشغيل الدالة B، والذي بدوره يقوم بتشغيل الدالة C، وحدث استثنائي في الدالة C. إذا لم يتم معالجة الاستثنائي في C، فإن الاستثنائي سيتم نقلها إلى B، ثم إلى A.
إذا لم يتم معالجة ذلك، سيتم إطلاق رسالة خطأ، وسيتوقف برنامجنا بشكل مفاجئ.
يمكن استخدام جملة try في بايثون لمعالجة الاستثناءات.
العمليات التي قد تؤدي إلى استثناءات يجب وضعها في جملة try، و كتابة كود معالجة الاستثناء في جملة except.
بعد التقاطع الاستثنائي، ما سنقوم به يعتمد علينا. هذا مثال بسيط.
# استيراد مكتبة sys للحصول على نوع الاستثنائية import sys randomList = ['a', 0, 2] for entry in randomList: try: print("الإدخال هو", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()[0], "حدث.") print("الإدخال التالي.") print() print("عكوس", entry, "هو", r)
النتائج الصادرة
الإدخال هو a Oops! <class 'ValueError'> حدث. الإدخال التالي. الإدخال هو 0 Oops! <class 'ZeroDivisionError'> حدث. الإدخال التالي. الإدخال هو 2 عكوس 2 هو 0.5
في هذا البرنامج، يتم تنفيذ الدورات حتى يتم إدخال عدد صحيح يحتوي على عكس معكوس صحيح. يتم وضع الجزء الذي قد يسبب استثنائية داخل بلاك try.
إذا لم يحدث أي استثنائية، فإنه يتم تجاوز محتويات البلاك ويستمر في عملية العادة. ولكن إذا حدث أي استثنائية، فإنها يتم التقاطعها من قبل بلاك except.
في هذا المثال، نستخدم وظيفة exinfo() من مكتبة sys لطباعة اسم الاستثنائية، ونطلب من المستخدم محاولة مرة أخرى. يمكننا رؤية أن القيم 'a' و '1.3' تسببان استثنائية ValueError، و '0' تسبب استثنائية ZeroDivisionError.
في هذا المثال، لم يتم ذكر أي استثنائية في جملة except.
ليس هذا عادةً عادةً ممارسة برمجة جيدة، لأنه سيقوم بحجز جميع الاستثنائيات ويقوم بمعالجتها بنفس الطريقة. يمكننا تحديد الاستثنائيات التي سيقوم جملة except بحجزها.
يمكن لجملة try أن تحتوي على أي عدد من جمل except لتعاملها بطريقة مختلفة، ولكن يتم تنفيذ جملة except واحدة فقط عند حدوث استثنائية.
يمكننا استخدام مجموعة القيم في جملة except لتعيين استثنائات متعددة. هنا مثال بديل.
try: # تنفيذ بعض الأوامر pass except ValueError: # معالجة استثنائية ValueError pass except (TypeError, ZeroDivisionError): # معالجة استثنائات متعددة # TypeError و ZeroDivisionError استثنائات pass except: # معالجة جميع الاستثناءات الأخرى pass
في برمجة بايثون، تكون الاستثناءات هي التي تُطلق عند حدوث خطأ في التنفيذ، ولكن يمكننا استخدام كلمة المفتاح raise لتوجيه إطلاق الاستثناء بشكل قسري.
يمكننا أيضًا اختيار نقل القيمة إلى الاستثناء لتوضيح السبب في إطلاق الاستثناء.
>>> raise KeyboardInterrupt Traceback (most recent call last): ... KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last): ... MemoryError: This is an argument >>> try: ... a = int(input("أدخل عدد صحيح إيجابي: ")) ... if a <= 0: ... raise ValueError("هذا ليس عدد صحيح!") ... except ValueError as ve: ... print(ve) ... أدخل عدد صحيح إيجابي: -2 هذا ليس عدد صحيح!
يمكن أن يكون جملة try في بايثون لها جملة finally اختيارية. سيتم تنفيذ هذه الجملة في جميع الحالات، وعادة ما تستخدم لتحرير الموارد الخارجية.
على سبيل المثال، يمكننا الاتصال عبر الشبكة بمراكز البيانات البعيدة أو استخدام ملف أو واجهة مستخدم رسومية (GUI).
في جميع هذه الحالات، يجب علينا إزالة الموارد مهما كان النجاح أو الفشل، هذه العمليات (إغلاق الملف، واجهة المستخدم الرسومية أو قطع الاتصال بالشبكة) تنفذ في جملة finally لضمان التنفيذ.
هذه هيعمليات ملفلإيضاح هذا النقطة.
try: f = open("test.txt", encoding = 'utf-8') # تنفيذ عمليات ملف finally: f.close()
هذا النوع من التركيبات يضمن إغلاق الملف حتى إذا حدث استثناء.