Latest web development tutorials

Обработка исключений C ++

Исключением являются процедурные вопросы, возникающие в процессе исполнения. C ++ исключение относится к особенным происходит, когда программа запущена, например, попытки деления на ноль операции.

Исключение предусматривается передача программы управления способом. Обработка исключений C ++ включает в себя триключевых слова: попробуйте, поймать, бросить.

  • бросить: Когда возникают проблемы, то программа выдаст исключение.Это делается с помощью ключевого словаброска , чтобы закончить.
  • поймать: где вы хотите иметь дело с проблемой, исключение перехватывается обработчика исключений.поймать ключевое слово используется для перехвата исключений.
  • попробуйте: попробуйтеблок - код идентифицирует конкретное исключение активируется. За ним, как правило, за которым следует один или более блоков улова.

Если есть блок генерирует исключение, поймать метод исключения используетпопытаться пойматьключевые слова. попытайтесь поместить блок кода может вызвать исключение, попробуйте блок-код известен как код с защитой. Использование попробовать / поймать синтаксис заявление выглядит следующим образом:

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

Если выпопытаетесь блок в различных контекстах будет бросать другое исключение, на этот раз вы можете попытаться перечислить несколько операторов уловапоймать различные типы исключений.

Сгенерирует исключение

Вы можете использовать операторбросить где - нибудь в блок кода вызывает исключение.Операнд заявление броска может быть любого типа выражение результата выражения определяет тип исключения брошено.

Ниже исключение Try нулю, деленной на примерах:

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;
}

Так как мы бросаем типконстантный символ * исключение, поэтому, когда улов это исключение, мы должны использовать константный символ * в блоке улова.Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

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

Здесь метод , что () является классом общественного исключения при условии , что он был перегружен все вложенные классы исключений.Это вернет причину этого исключения генерируемой.