سؤال

الاستثناءات في C++ لا تحتاج إلى أن يقبض (لا وقت الترجمة أخطاء) من خلال وظيفة الدعوة.لذلك والامر متروك المطور الحكم سواء للقبض عليهم باستخدام حاول/catch (خلافا في جافا).

هل هناك طريقة واحدة يمكن أن تضمن استثناءات دائما اشتعلت باستخدام حاول/catch من خلال وظيفة الدعوة?

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

المحلول

لا.

انظر عملي ننظر استثناء المواصفات لأسباب لماذا لا.

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

نصائح أخرى

يجب أن لا تستخدم استثناء هنا.من الواضح أن هذه ليست حالة استثنائية إذا كنت بحاجة إلى أن أتوقع في كل مكان كنت تستخدم هذه الوظيفة!

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

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}

خارج نطاق السؤال الخاص بك لذا لن اناقش نشر هذا ولكن في جاوة في الواقع هناك 2 أنواع من الاستثناءات ، و التحقق من دون رادع.الفرق الأساسي هو أن مثل الكثير في c[++], ليس عليك أن تقبض لحالها استثناء.

للحصول على إشارة جيدة جرب هذا

كريس'ربما لديه أفضل نقية الإجابة على السؤال:

ومع ذلك, أنا غريبة عن أصل السؤال.إذا كان يجب على المستخدم دائما التفاف الدعوة في try/catch, يجب على المستخدم يسمى وظيفة يكون حقا رمي الاستثناءات في المقام الأول ؟

هذا هو السؤال الصعب الإجابة دون مزيد من السياق فيما يتعلق بمدونة-قاعدة في السؤال.اطلاق النار من الورك ، أعتقد أن أفضل إجابة هنا هو التفاف على وظيفة من هذا القبيل أن الموصى بها (إن لم يكن الوحيد ، اعتمادا على مجمل أسلوب استثناء من القانون) واجهة عامة لا حاول/catch بالنسبة المستخدم.إذا كنت مجرد محاولة للتأكد من أنه لا توجد الاستثناءات غير المعالجة في التعليمات البرمجية الخاصة بك ، وحدة الاختبارات ومراجعة التعليمات البرمجية التي هي على الأرجح أفضل حل.

هل هناك طريقة واحدة يمكن التأكد من أن استثناءات دائما اشتعلت استخدام try/catch طريق الدعوة وظيفة ؟

أجد الأمر مضحكا, Java الحشد بما في ذلك نفسي - يحاول تجنب فحص استثناءات.انهم يحاولون العمل في طريقهم حول أن يضطر إلى الصيد الاستثناءات باستخدام RuntimeExceptions.

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

في C++11 و إلى الأمام, لدينا الآن noexcept محدد.
مرة أخرى, إذا كان التوقيع ملحوظ لرمي هناك لا يزال غير ديهم requriement أن يتم التعامل معها من قبل المتصل.


اعتمادا على السياق ، يمكنك التأكد من أن استثنائية السلوك يتم التعامل معها عن طريق الترميز إلى نوع النظام.

انظر: الأمراض المنقولة جنسيا::اختياري كجزء من المكتبة الأساسيات.

أو يمكنك أن تبدأ برمي الحرجة استثناءات.ومن المؤكد حدوث انتهاك وصول استثناء قبض المستخدمين الاهتمام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top