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

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

في Python، يمكنك تحديد الاستثناءات المخصصة ورفعها عند حدوث حالات خطأ محددة. يمكنك إدارة أخطاء محددة ومفيدة باستخدام استثناءات مخصصة، مما يؤدي إلى تحسين إمكانية قراءة التعليمات البرمجية وقابلية صيانتها.

لماذا تحتاج إلى استثناءات مخصصة؟

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

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

instagram viewer

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

كيفية تحديد الاستثناءات المخصصة

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

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

وإليك فئة استثناء مخصصة، MyCustomError:

classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)

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

كيفية رفع الاستثناءات المخصصة

لرفع خطأ، استخدم يرفع الكلمة الأساسية متبوعة بمثيل لفئة الاستثناء المخصصة الخاصة بك، وتمرير رسالة خطأ إليها كوسيطة:

ifTrue:
raise MyCustomError("A Custom Error Was Raised...")

يمكنك أيضًا رفع الخطأ دون تمرير أي وسيطات:

ifTrue:
raise MyCustomError # shorthand

أي من التنسيقين مناسب لرفع الأخطاء المخصصة.

كيفية التعامل مع الاستثناءات المخصصة

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

try:
print("Hello, You're learning how to MakeUseOf Custom Errors")
raise MyCustomError("Opps, Something Went Wrong...")
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Done Handling Custom Error")

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

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

try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")

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

وراثة فئات الخطأ المخصصة

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

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

classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message

بمجرد حصولك على فئة الاستثناء المخصصة الأساسية هذه، يمكنك إنشاء فئات استثناء فرعية ترث منها:

classAPINotFoundError(BaseAPIException):
Raised when the requested resource is not found in the API.
pass

classAPIAuthenticationError(BaseAPIException):
Raised when there's an issue with authentication to the API.
pass

classAPIRateLimitExceeded(BaseAPIException):
Raised when the rate limit for API requests is exceeded.
pass

قم برفع هذه الاستثناءات المخصصة والتقاطها عند إجراء استدعاءات لواجهة برمجة التطبيقات (API) داخل تطبيق الويب الخاص بك. تعامل معها وفقًا لذلك باستخدام المنطق المناسب في التعليمات البرمجية الخاصة بك.

defrequest_api():
try:
# Simulate an API error for demonstration purposes
raise APINotFoundError("Requested resource not found.")
except APINotFoundError as err:
# Log or handle the 'Not Found' error case
print(f"API Not Found Error: {err}")
except APIAuthenticationError:
# Take appropriate actions for authentication error
print(f"API Authentication Error: {err}")
except APIRateLimitExceeded:
# Handle the rate limit exceeded scenario
print(f"API Rate Limit Exceeded: {err}")
except BaseAPIException:
# Handle other unknown API exceptions
print(f"Unknown API Exception: {err}")

تتحقق جملة الاستثناء النهائية من الفئة الأصلية وتعمل بمثابة أداة شاملة لأية أخطاء أخرى متعلقة بواجهة برمجة التطبيقات (API).

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

التفاف الاستثناءات المخصصة

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

فكر في السيناريو الذي يتفاعل فيه تطبيق الويب الخاص بك مع واجهة برمجة التطبيقات (API). إذا أثارت واجهة برمجة التطبيقات a خطأ بحث، يمكنك الإمساك به، ثم رفع العرف APINotFoundError الاستثناء الذي يشير إلى LookupError كسبب له:

defrequest_api():
try:
# Simulate an API error for demonstration purposes
# Assuming the external API raised a LookupError
raise LookupError("Sorry, You Encountered A LookUpError !!!")
except LookupError as original_exception:
try:
# Wrap the original exception with a custom exception
raise APINotFoundError \
("Requested resource not found.") from original_exception
except APINotFoundError as wrapped_exception:
# Handle the wrapped exception here
print(f"Caught wrapped API exception: {wrapped_exception}")

# or re-raise it if necessary
raise

try:
request_api()
except APINotFoundError as err:
print(f"Caught API exception: {err.__cause__}")

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

عند حدوث الاستثناء المخصص، فإنه يتضمن الاستثناء الأصلي كـ a __سبب__ السمة، مما يوفر رابطًا بين الاستثناء المخصص والاستثناء الأصلي. يتيح لك هذا تتبع أصل الاستثناء.

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

تخصيص سلوك الفصل في بايثون

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