القائمة الرئيسية

الصفحات

دورة البرمجة بلغة بايثون - الدرس الثالث والثلاثون (الاستثناءات المخصصة)

دورة البرمجة بلغة بايثون - الدرس الثالث والثلاثون (الاستثناءات المخصصة)

دورة البرمجة بلغة بايثون - الدرس الثالث والثلاثون (الاستثناءات المخصصة)

في هذا البرنامج التعليمي ، ستتعلم كيفية تحديد الاستثناءات المخصصة بناءً على متطلباتك بمساعدة الأمثلة.


يوجد في بايثون العديد من الاستثناءات المضمنة التي تجبر برنامجك على إخراج خطأ عندما يحدث خطأ ما في البرنامج.


ومع ذلك ، قد تحتاج في بعض الأحيان إلى إنشاء استثناءات مخصصة تخدم غرضك.


إنشاء استثناءات مخصصة

في بايثون ، يمكن للمستخدمين تحديد استثناءات مخصصة عن طريق إنشاء فئة جديدة. يجب اشتقاق فئة الاستثناء هذه ، بشكل مباشر أو غير مباشر ، من فئة الاستثناء المضمنة. معظم الاستثناءات المضمنة مشتقة أيضًا من هذه الفئة.

>>> class CustomError(Exception):
...     pass
...

>>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError

>>> raise CustomError("An error occurred")
Traceback (most recent call last):
...
__main__.CustomError: An error occurred


هنا ، قمنا بإنشاء استثناء معرف من قبل المستخدم يسمى CustomError والذي يرث من فئة الاستثناء. يمكن رفع هذا الاستثناء الجديد ، مثل الاستثناءات الأخرى ، باستخدام تعليمة الزيادة مع رسالة خطأ اختيارية.


عندما نقوم بتطوير برنامج بايثون كبير ، فمن الجيد وضع جميع الاستثناءات التي يحددها المستخدم والتي يثيرها برنامجنا في ملف منفصل. العديد من الوحدات القياسية تفعل ذلك. يعرّفون استثناءاتهم بشكل منفصل على أنها exceptions.py أو errors.py (بشكل عام ولكن ليس دائمًا).


يمكن لفئة الاستثناء المعرفة من قبل المستخدم تنفيذ كل شيء يمكن لفئة عادية القيام بذلك ، لكننا بشكل عام نجعلها بسيطة وموجزة. تعلن معظم التطبيقات عن فئة أساسية مخصصة وتشتق فئات استثناء أخرى من هذه الفئة الأساسية. تم توضيح هذا المفهوم في المثال التالي.


مثال: استثناء محدد من قبل المستخدم في بايثون

في هذا المثال ، سنوضح كيف يمكن استخدام الاستثناءات المعرفة من قبل المستخدم في برنامج لرفع الأخطاء والتقاطها.


سيطلب هذا البرنامج من المستخدم إدخال رقم حتى يخمن الرقم المخزن بشكل صحيح. لمساعدتهم في اكتشاف ذلك ، يتم تقديم تلميح ما إذا كان تخمينهم أكبر من الرقم المخزن أو أقل منه.

# define Python user-defined exceptions
class Error(Exception):
    """Base class for other exceptions"""
    pass


class ValueTooSmallError(Error):
    """Raised when the input value is too small"""
    pass


class ValueTooLargeError(Error):
    """Raised when the input value is too large"""
    pass


# you need to guess this number
number = 10

# user guesses a number until he/she gets it right
while True:
    try:
        i_num = int(input("Enter a number: "))
        if i_num < number:
            raise ValueTooSmallError
        elif i_num > number:
            raise ValueTooLargeError
        break
    except ValueTooSmallError:
        print("This value is too small, try again!")
        print()
    except ValueTooLargeError:
        print("This value is too large, try again!")
        print()

print("Congratulations! You guessed it correctly.")


هنا نموذج تشغيل لهذا البرنامج.

Enter a number: 12
This value is too large, try again!

Enter a number: 0
This value is too small, try again!

Enter a number: 8
This value is too small, try again!

Enter a number: 10
Congratulations! You guessed it correctly.


لقد حددنا فئة أساسية تسمى Error.


الاستثناءان الآخران (ValueTooSmallError و ValueTooLargeError) اللذان تم رفعهما بالفعل بواسطة برنامجنا مشتق من هذه الفئة. هذه هي الطريقة القياسية لتحديد الاستثناءات التي يحددها المستخدم في برمجة بايثون ، لكنك لست مقيدًا بهذه الطريقة فقط.


تخصيص فئات الاستثناء

يمكننا تخصيص هذا الفصل بشكل أكبر لقبول الحجج الأخرى حسب احتياجاتنا.


للتعرف على تخصيص فئات Exception ، يجب أن تكون لديك المعرفة الأساسية للبرمجة الموجهة للكائنات.


لنلق نظرة على مثال واحد:

class SalaryNotInRangeError(Exception):
    """Exception raised for errors in the input salary.

    Attributes:
        salary -- input salary which caused the error
        message -- explanation of the error
    """

    def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
        self.salary = salary
        self.message = message
        super().__init__(self.message)


salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
    raise SalaryNotInRangeError(salary)


الناتج

Enter salary amount: 2000
Traceback (most recent call last):
  File "<string>", line 17, in <module>
    raise SalaryNotInRangeError(salary)
__main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range


هنا ، تجاوزنا مُنشئ فئة Exception لقبول رسالة الوسيطات المخصصة الخاصة بنا. بعد ذلك ، يتم استدعاء مُنشئ فئة الاستثناء الأصلية يدويًا باستخدام وسيطة self.message باستخدام ()super 


يتم تحديد سمة self.salary المخصصة لاستخدامها لاحقًا.


يتم بعد ذلك استخدام طريقة __str__ الموروثة لفئة الاستثناء لعرض الرسالة المقابلة عند رفع SalaryNotInRangeError


يمكننا أيضًا تخصيص طريقة __str__ نفسها عن طريق تجاوزها.

class SalaryNotInRangeError(Exception):
    """Exception raised for errors in the input salary.

    Attributes:
        salary -- input salary which caused the error
        message -- explanation of the error
    """

    def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
        self.salary = salary
        self.message = message
        super().__init__(self.message)

    def __str__(self):
        return f'{self.salary} -> {self.message}'


salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
    raise SalaryNotInRangeError(salary)


الناتج

Enter salary amount: 2000
Traceback (most recent call last):
  File "/home/bsoyuj/Desktop/Untitled-1.py", line 20, in <module>
    raise SalaryNotInRangeError(salary)
__main__.SalaryNotInRangeError: 2000 -> Salary is not in (5000, 15000) range

reaction:
Ahmed Taher
Ahmed Taher
مدون من العراق . احب البرمجة وكل ما يتعلق بالشبكات والسيرفرات وامن المعلومات . واسعى الى توفير جميع المصادر والمواد للامتحانات الدولية.

تعليقات