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

أفضل الممارسات لتنفيذ معالجة الاستثناءات في بايثون

تم النشر بتاريخ 2024-09-27
تصفح:381

Best Practices for Implementing Exception Handling in Python

تعد كتابة تعليمات برمجية فعالة لمعالجة الاستثناءات أمرًا ضروريًا لإنشاء تطبيقات قوية وقابلة للصيانة.
فيما يلي بعض أفضل الممارسات لكتابة كود معالجة الاستثناءات في بايثون:

1. أمسك فقط بما يمكنك التعامل معه

كن محددًا:

  • احصل على استثناءات محددة بدلاً من استخدام جملة باستثناء واسعة النطاق.
  • يضمن هذا أنه يتم اكتشاف الاستثناءات التي تتوقعها وتعرف كيفية التعامل معها فقط.
try:
    # Code that might raise an exception
except ValueError as e:
    print(f"Value error occurred: {e}")

2. تجنب العارية إلا : الشروط

التقاط استثناءات محددة:

  • تجنب استخدام باستثناء: دون تحديد نوع الاستثناء.
  • قد يؤدي ذلك إلى اكتشاف أخطاء غير متوقعة ويجعل تصحيح الأخطاء أمرًا صعبًا.
try:
    # Code that might raise an exception
except Exception as e:  # Catch all exceptions if necessary
    print(f"An error occurred: {e}")

3. استخدم كتل المحاولة باستثناء آخر أخيرًا

  • حاول: ضع الكود الذي قد يؤدي إلى حدوث استثناء هنا.
  • باستثناء: التعامل مع الاستثناءات في هذه الكتلة.
  • آخر: تنفيذ هذه الكتلة إذا لم يظهر أي استثناء في كتلة المحاولة.
  • أخيرًا: قم بتنفيذ هذه الكتلة بغض النظر عما إذا تم ظهور استثناء أم لا، وغالبًا ما يستخدم للتنظيف.
try:
    # Code that might raise an exception
except ValueError as e:
    print(f"Value error: {e}")
else:
    print("No exceptions occurred.")
finally:
    print("This will always be executed.")

4. استثناءات السجل

  • استخدم وحدة التسجيل لتسجيل الاستثناءات.
  • يساعد التسجيل في تشخيص المشكلات في الإنتاج دون الكشف عن الأخطاء للمستخدمين النهائيين.
import logging

logging.basicConfig(level=logging.ERROR)

try:
    # Code that might raise an exception
except Exception as e:
    logging.error(f"An error occurred: {e}")

5. إعادة طرح الاستثناءات عند الضرورة

  • إذا وجدت استثناءً ولكن لم تتمكن من التعامل معه بشكل كامل، ففكر في إعادة رفعه حتى يمكن التعامل معه في مكان آخر.
try:
    # Code that might raise an exception
except ValueError as e:
    logging.error(f"Value error: {e}")
    raise  # Re-raise the exception

6. استخدم مديري السياق لإدارة الموارد

  • استخدم مديري السياق (مع العبارة) لإدارة الموارد مثل الملفات أو المقابس أو اتصالات قاعدة البيانات.
  • يضمن ذلك تحرير الموارد بشكل صحيح حتى في حالة ظهور استثناء.
with open('file.txt', 'r') as file:
    content = file.read()

7. التدهور الرشيق

- بدلاً من السماح لتطبيقك بالتعطل، قم بتوفير آليات احتياطية أو رسائل خطأ سهلة الاستخدام.

  • على سبيل المثال، إذا كان ملف التكوين مفقودًا، فيمكنك استخدام الإعدادات الافتراضية بدلاً من ذلك.
try:
    with open('config.json', 'r') as file:
        config = json.load(file)
except FileNotFoundError:
    print("Config file not found, using defaults.")
    config = {"default": "value"}

8. تجنب ابتلاع الاستثناءات

  • لا تلتقط الاستثناءات دون اتخاذ أي إجراء.
  • يمكن أن يؤدي تجاهل الاستثناءات إلى إخفاء الأخطاء وجعل التطبيق يتصرف بشكل غير متوقع.
try:
    # Code that might raise an exception
except Exception as e:
    pass  # Bad practice - you're ignoring the error

9. استثناءات الوثيقة

  • استخدم سلاسل المستندات لتوثيق الاستثناءات التي يمكن أن تثيرها وظائفك.
  • يساعد هذا المطورين الآخرين على فهم الاستثناءات المتوقعة وكيفية التعامل معها.
def divide(a, b):
    """
    Divides two numbers.

    :param a: Numerator.
    :param b: Denominator.
    :return: The result of the division.
    :raises ZeroDivisionError: If the denominator is zero.
    """
    if b == 0:
        raise ZeroDivisionError("Cannot divide by zero.")
    return a / b

10. استخدم الاستثناءات المخصصة عندما يكون ذلك مناسبًا

  • قم بإنشاء استثناءات مخصصة لتمثيل حالات خطأ محددة في تطبيقك.
  • قد يؤدي ذلك إلى جعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة وأسهل في الصيانة.
class InvalidInputError(Exception):
    """Exception raised for invalid inputs."""
    pass

def process_input(value):
    if not isinstance(value, int):
        raise InvalidInputError("Input must be an integer.")
    return value * 2

11. التعامل مع استثناءات الاختبار

  • اكتب الاختبارات للتأكد من أن معالجة الاستثناءات الخاصة بك تعمل كما هو متوقع.
  • استخدم أطر عمل مثل Unittest أو pytest لاختبار الحالات العادية والاستثنائية.
def test_divide():
    assert divide(10, 2) == 5
    with pytest.raises(ZeroDivisionError):
        divide(10, 0)

12. تجنب الإفراط في استخدام الاستثناءات

استخدام الاستثناءات للحالات الاستثنائية:

  • يجب استخدام الاستثناءات للظروف غير المتوقعة، وليس كآلية تحكم منتظمة في التدفق.
  • على سبيل المثال، تجنب استخدام الاستثناءات للتعامل مع الظروف المتوقعة مثل نهاية الحلقة.
# Bad practice: using exceptions for control flow
try:
    while True:
        value = next(iterator)
except StopIteration:
    pass  # End of iteration

13. استثناءات السلسلة للسياق

  • تسمح لك بايثون بتسلسل الاستثناءات للحفاظ على السياق الأصلي عند رفع استثناء جديد.
  • استخدم من لربط الاستثناءات ذات الصلة.
try:
    result = process_input(input_value)
except InvalidInputError as e:
    raise ValueError("Failed to process input") from e

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


الموارد

  • وثائق بايثون الرسمية حول معالجة الاستثناءات
  • وثائق وحدة التسجيل في بايثون
  • PEP 8 - دليل أسلوب كود Python (لممارسات الترميز العامة بما في ذلك الاستثناءات)
  • بايثون الحقيقية - معالجة الاستثناءات
بيان الافراج تم نشر هذه المقالة على: https://dev.to/kyotanakada/best-practices-for-implementing-exception-handling-in-python-1ni1?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3