Latest web development tutorials

C ++ معالجة الاستثناء

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

ويرد استثناء وسيلة تحكم البرنامج نقل. ويشمل C ++ معالجة الاستثناء ثلاثكلمات: محاولة، الصيد، ورمي.

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

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

try
{
   // 保护代码
}catch( ExceptionName e1 )
{
   // catch 块
}catch( ExceptionName e2 )
{
   // catch 块
}catch( ExceptionName eN )
{
   // catch 块
}

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

رمي استثناء

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

وفيما يلي استثناء حاول صفر مقسوما الأمثلة على ذلك:

double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}

قبض على استثناء

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

try
{
   // 保护代码
}catch( ExceptionName e )
{
  // 处理 ExceptionName 异常的代码
}

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

try
{
   // 保护代码
}catch(...)
{
  // 能处理任何异常的代码
}

هنا مثال من القسمة على صفر رميات استثناء، ويتم اكتشاف الاستثناء في كتلة الصيد.

#include <iostream>
using namespace std;

double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}

int main ()
{
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
     z = division(x, y);
     cout << z << endl;
   }catch (const char* msg) {
     cerr << msg << endl;
   }

   return 0;
}

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

Division by zero condition!

استثناءات القياسية C ++

يوفر C ++ مجموعة من الاستثناءات القياسية المحددة في<استثناء>، يمكننا استخدام هذه الاستثناءات قياسية في البرنامج.وهي تستند إلى التسلسل الهرمي فئة الوالدين والطفل نظمت على النحو التالي:

C ++ التسلسل الهرمي استثناء

الجدول التالي هو وصف كل من التسلسل الهرمي أعلاه يبدو غير طبيعي:

异常 描述
std::exception 该异常是所有标准 C++ 异常的父类。
std::bad_alloc 该异常可以通过new抛出。
std::bad_cast 该异常可以通过dynamic_cast抛出。
std::bad_exception 这在处理 C++ 程序中无法预期的异常时非常有用。
std::bad_typeid 该异常可以通过typeid抛出。
std::logic_error 理论上可以通过读取代码来检测到的异常。
std::domain_error 当使用了一个无效的数学域时,会抛出该异常。
std::invalid_argument 当使用了无效的参数时,会抛出该异常。
std::length_error 当创建了太长的 std::string 时,会抛出该异常。
std::out_of_range 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。
std::runtime_error 理论上不可以通过读取代码来检测到的异常。
std::overflow_error 当发生数学上溢时,会抛出该异常。
std::range_error 当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error 当发生数学下溢时,会抛出该异常。

تحديد استثناء جديد

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

#include <iostream>
#include <exception>
using namespace std;

struct MyException : public exception
{
  const char * what () const throw ()
  {
    return "C++ Exception";
  }
};
 
int main()
{
  try
  {
    throw MyException();
  }
  catch(MyException& e)
  {
    std::cout << "MyException caught" << std::endl;
    std::cout << e.what() << std::endl;
  }
  catch(std::exception& e)
  {
    //其他的错误
  }
}

وهذا ينتج النتائج التالية:

MyException caught
C++ Exception

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