سؤال

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

Public Function GetNextNonDuplicateNumber(NumberToCheck as Long) as Long

      //the non-duplicate the function will return
      Dim NonDuplicate as Long

      If CheckForDuplicate(NumberToCheck) = True Then
          Throw New DuplicateException()
      Else
          NonDuplicate = NumberToCheck
      End If

End Function

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

Catch ex as DuplicateException
   NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck)
   Throw ex
   Return NonDuplicate
End Function

وكما ترون، أريد لمعالجة الاستثناء على وجه التحديد، ولكن أريد أيضا أن رميها عندما انتهيت لأنني أريد لتنبيه رمز آخر خارج الدالة.

والمشكلة هي أن مجرد رمي خروجها من وظيفة بقيمة null. أنا أفكر عن try/catch بطريقة خاطئة، أم أن هناك طريقة للالتفاف حول هذا؟

هل كانت مفيدة؟

المحلول

إذا اشتعلت استثناء وتعافى منه (مع IncrementToNonDuplicate الخاص بك ...) ثم لا يوجد سبب لرمي استثناء بعد الآن. كود بين الصيد ومحاولة نهاية ينبغي أن مجرد تنظيف الموارد مثل إغلاق ملف أو datareader إذا كنت سوف rethrow ذلك.

هل يمكن بدلا إرجاع بنية يحتوي على قيمة NonDuplicate والمعلومات المطلوبة حول أخطاء في وظيفة. وهناك طريقة أخرى تتمثل في رمي استثناء المخصصة التي سوف تحتوي على معلومات مثل "عدد غير صالح: يجب أن يكون ...)

نصائح أخرى

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

Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top