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

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

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

    يستخدم المثال التالي الجملة البرمجية if للتحقق مما إذا كان الاتصال مغلق. يمكن استخدام هذا الأسلوب بدلاً من إلقاء استثناء إذا لم يكن الاتصال مغلق.

       If conn.State <> ConnectionState.Closed Then
          conn.Close()
       End If
    
       if(conn.State != ConnectionState.Closed)
          conn.Close();
    

    في المثال التالي، يتم طرح استثناء إذا لم يتم إغلاق الاتصال.

       Try
          conn.Close()
       Catch ex As InvalidOperationException
          'Do something with the error or ignore it.
       End Try
    
       try {
         conn.Close();
       }
       catch(InvalidOperationException ex) {
         //Do something with the error or ignore it.
       }
    

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

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

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

  • يتم إنهاء أسماء فئة الاستثناء بالكلمة "Exception". فعلى سبيل المثال:

    Public Class EmployeeListNotFoundException
        Inherits Exception
    
    public class MyFileNotFoundException : Exception {
    }
    
  • عند إنشاء استثناءات معرّفة من قبل المستخدم، فعليك التأكد من أن ملفات التعريف الخاصة بالاستثناءات متوفرة للتعليمات البرمجية عن بعد للتنفيذ، بما في ذلك عند حدوث استثناءات عبر مجالات التطبيقات. على سبيل المثال، افترض أن مجال التطبيق A يقوم بإنشاء مجال التطبيق B، والذي ينفذ التعليمات البرمجية التي تطرح استثناء. "مجال التطبيق" أ لجذب بشكل صحيح ومعالجة ‏‏ استثناء، فيجب أن يكون قادراً على العثور على التجميع الذي يحتوي على ‏‏ استثناء تم طرح عن طريق "ب" تطبيق مجال. إذا كان تطبيق المجال B يطرح استثناء التي هو المضمنة في تجميع ضمن قاعدة تطبيق الخاص به، ولكن ليس ضمن "مجال تطبيق" الخاص قاعدة تطبيقات، أ "لمجال تطبيق" لن تكون قادراً على العثور على ‏‏ استثناء وسيتم طرح وقت تشغيل اللغة العامة FileNotFoundException. لتجنب مثل تلك الموقف، يمكنك نشر تجميع يحتوي على معلومات الاستثناء بطريقتين:

    • وضع التجميع في قادعة تطبيقات شائعة مشتركة من قبل كل مجالات التطبيق

      -أو-

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

  • في C# أو C++ ، استخدام علي الأقل ثلاث مُنشئات شائعة عند إنشاء فئات الاستثناء الخاصة بك. على سبيل المثال ، راجع كيفية القيام بما يلي: إنشاء استثناءات مُعرفة من قبل المستخدم.

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

  • لمعظم التطبيقات، قم باشتقاق استثناءات مخصصة من الفئة Exception. من المعتقد في الأصل أن الاستثناءات المخصصة يجب أن تكون مشتقة من الفئة ApplicationException; ومع في عملياً لم يتم اكتشاف أن ذلك لم يضيف أي قيمة هامة.

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

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

  • قم بتوفير الخصائص Exception للوصول البرمجي. قم بتضمين معلومات إضافية في الاستثناء (بالإضافة إلى سلسلة الوصف) فقط عند وجود سيناريو برمجي حيث تكون المعلومات الإضافية مفيدة.

  • قم بإرجاع فارغ لحالات الخطأ الشائعة للغاية. على سبيل المثال، يقوم Open بإرجاع null إذا لم يتم العثور على الملف، ولكن يطرح استثناء إذا تم تأمين الملف.

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

Class FileRead

    Public Sub Open(ByVal fileToRead As FileStream)

        ' This If statement is optional
        ' as it is very unlikely that
        ' the stream would ever be null
        If IsDBNull(fileToRead) Then
            Throw New System.ArgumentNullException()
        End If

        Dim b As Integer

        ' Set the stream position to the beginning of the file.
        fileToRead.Seek(0, SeekOrigin.Begin)

        ' Read each byte to the end of the file.
        For i As Integer = 0 To fileToRead.Length
            b = fileToRead.ReadByte()
            Console.Write(b.ToString())
            ' Or do something else with the byte.
        Next
    End Sub

End Class
class FileRead {
    public void Open(FileStream fileToRead) 
    {

        // This if statement is optional
        // as it is very unlikely that
        // the stream would ever be null.
        if (fileToRead == null)
        {
            throw new System.ArgumentNullException();
        }

        int b;

        // Set the stream position to the beginning of the file.
        fileToRead.Seek(0, SeekOrigin.Begin);

        // Read each byte to the end of the file.
        for (int i = 0; i < fileToRead.Length; i++)
        {
            b = fileToRead.ReadByte();
            Console.Write(b.ToString());
            // Or do something else with the byte.
        }
    }
} 

قم بطرح InvalidOperationException إذا لم يكن تعيين خاصية أو استدعاء أسلوب مناسب للحالة الحالية للكائن المُعطى.

قم بطرح ArgumentException أو فئة مشتقة من ArgumentException إذا تم تمرير معلمات غير صالحة.

يبدأ المكدس بالتتبع عند الجملة التي تم طرح الاستثناء عندها وينتهي عند جملة التقاط التي تم التقاط الاستثناء عندها. يجب أن تكون على علم بتلك الحقيقة عند تقرير مكان طرح عبارة الاستثناء.

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

Class File
   Private fileName As String
   
   Public Function Read(bytes As Integer) As Byte()
      If Not ReadFile(handle, bytes) Then
         Throw NewFileIOException()
      End If
   End Function 'Read
   
   Function NewFileIOException() As FileException
      Dim description As String = __unknown ' Build localized string, including fileName.
      Return New FileException(description) '
   End Function 'NewFileIOException
End Class 'File

راجع أيضًا:

موارد أخرى

معالجة و طرح الاستثناءات