يتم إنشاء الاستثناءات المعرفة من قبل المستخدم عن طريق تحديد فئة جديدة ترث منها الاستثناء المدمج في بايثون الفئة أو أحد فئاتها الفرعية. من خلال القيام بذلك، يمكننا إنشاء رسائل خطأ مخصصة والتعامل مع أخطاء محددة بطريقة منطقية لتطبيقنا.
المصفوفات في البرمجة C
خطوات إنشاء واستخدام الاستثناءات المحددة من قبل المستخدم
اتبع هذه الخطوات لإنشاء واستخدام الاستثناءات المحددة بواسطة المستخدم في بايثون:
- تحديد فئة استثناء جديدة: قم بإنشاء فئة جديدة ترث من الاستثناء أو أي من فئاته الفرعية.
- رفع الاستثناء: استخدم عبارة الرفع لرفع الاستثناء المحدد من قبل المستخدم عند حدوث شرط معين.
- التعامل مع الاستثناء: استخدم كتل المحاولة باستثناء التعامل مع الاستثناء المحدد من قبل المستخدم.
مثال: في هذا المثال، قمنا بإنشاء استثناء مخصص InvalidAgeError للتأكد من أن قيم العمر تقع ضمن نطاق صالح (0–120).
Python# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120'): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f'Age set to: {age}') # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
الإخراج
150 -> Age must be between 0 and 120
توضيح:
- فئة InvalidAgeError ترث من الاستثناء. وهو يحدد __حار__
- يقوم الأسلوب __str__ بإرجاع تمثيل سلسلة قابلة للقراءة للخطأ.
- في set_age() إذا كان العمر خارج النطاق الصالح (0-120)، فسيتم رفع الاستثناء.
- تلتقط كتلة المحاولة باستثناء الاستثناء وتطبع رسالة الخطأ.
تخصيص فئات الاستثناء
عندما نقوم بإنشاء استثناء مخصص، فإننا نصنف فئة فرعية من فئة الاستثناء المضمنة في Python (أو فئة فرعية مثل ValueError TypeError وما إلى ذلك). يمكننا بعد ذلك إضافة أساليب السمات الخاصة بنا أو المنطق المخصص لجعل الاستثناء أكثر إفادة.
يمكننا أيضًا تحسين الاستثناءات المخصصة عن طريق إضافة سمات إضافية أو طرق تجاوز.
مثال: نقوم هنا بتحسين InvalidAgeError عن طريق إضافة رمز خطأ وتخصيص رسالة الخطأ.
Pythonclass InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120' error_code=1001): self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) def __str__(self): return f'[Error Code {self.error_code}] {self.age} -> {self.msg}' try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
الإخراج
[Error Code 1001] 150 -> Age must be between 0 and 120
توضيح:
- يحتوي InvalidAgeError الآن على سمة إضافية error_code.
- تم تجاوز طريقة __str__ لعرض كل من رمز الخطأ والعمر.
- عند تنفيذ set_age(150)، يتم رفع الاستثناء واحتجازه في كتلة المحاولة باستثناء.
- تتم طباعة رسالة الخطأ المخصصة مما يجعل الخطأ أكثر وصفًا.
استخدام الاستثناءات القياسية كفئة أساسية
في بعض الأحيان، بدلاً من الوراثة مباشرة من الاستثناء، يمكننا إنشاء استثناء مخصص عن طريق تصنيف استثناء قياسي إلى فئة فرعية مثل RuntimeError ValueError وما إلى ذلك. يكون هذا مفيدًا عندما يجب التعامل مع الاستثناء المخصص الخاص بك كنوع معين من الأخطاء.
مثال: يوضح هذا المثال كيفية إنشاء استثناء مخصص NetworkError عن طريق الوراثة من RuntimeError وهو استثناء قياسي مدمج.
Python# NetworkError has base RuntimeError and not Exception class NetworkError(RuntimeError): def __init__(self arg): self.args = (arg) # store as tuple try: raise NetworkError('Connection failed') except NetworkError as e: print(e.args)
الإخراج
('Connection failed') توضيح:
- يرث NetworkError من RuntimeError وهو نوع استثناء مضمن.
- عند رفع الرسالة، يتم تخزينها في سمة args على شكل صف.
- يتم اكتشاف الاستثناء ويتم عرض الوسائط المخزنة الخاصة به.
مثال من العالم الحقيقي: خطأ في البريد الإلكتروني غير صالح
فيما يلي مثال بسيط حيث نطرح استثناءً مخصصًا إذا كان عنوان البريد الإلكتروني غير صالح:
Pythonclass InvalidEmailError(Exception): def __init__(self email msg='Invalid email format'): self.email = email self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.email} -> {self.msg}' def set_email(email): if '@' not in email: raise InvalidEmailError(email) print(f'Email set to: {email}') try: set_email('userexample.com') except InvalidEmailError as e: print(e)
الإخراج
userexample.com -> Invalid email format
توضيح:
- تم تعريف فئة استثناء جديدة InvalidEmailError للتحقق من صحة عناوين البريد الإلكتروني.
- إذا كان البريد الإلكتروني المحدد لا يحتوي على "@"، فسيتم طرح الاستثناء.
- تكتشف كتلة المحاولة باستثناء الخطأ وتطبع الرسالة المنسقة.
متى يتم استخدام الاستثناءات المحددة من قبل المستخدم؟
ينبغي أخذ الاستثناءات المعرفة من قبل المستخدم في الاعتبار في السيناريوهات التالية:
- تمثيل أخطاء محددة في أحد التطبيقات (مثل InvalidAgeError DatabaseConnectionError).
- توفير رسائل خطأ أكثر وضوحًا ووصفًا.
- معالجة مجموعة من الأخطاء المرتبطة بشكل منفصل باستخدام باستثناء.
باستخدام الاستثناءات المحددة من قبل المستخدم، تصبح البرامج أكثر قابلية للقراءة والصيانة وأسهل في التصحيح.