Latest web development tutorials

C ++ obsługi wyjątków

Wyjątkiem są kwestie proceduralne wynikłe w trakcie realizacji. C ++ wyjątek odnosi się do szczególnego się nie dzieje, gdy program jest uruchomiony, takich jak próby dzielenia przez działania zerowego.

Wyjątkiem jest sposób sterowania programem transferu. C ++ obsługi wyjątków obejmuje trzykluczowe: try, catch, throw.

  • rzucić: Gdy pojawiają się problemy, program wygeneruje wyjątek.Odbywa się to za pomocą słowa kluczowegorzut do zakończenia.
  • złapać: gdzie chcesz do czynienia z problemem, wyjątek zostanie złapany przez program obsługi wyjątków.Hasłopołów jest używany do połowu wyjątki.
  • spróbuj: spróbujkod blokowy identyfikuje konkretny wyjątek zostanie aktywowany. Za nim następuje zazwyczaj jednego lub kilku bloków połowów.

Jeśli nie jest blok zgłasza wyjątek, metoda połowu wyjątek wykorzystujepróbować łapaćsłowa kluczowe. spróbuj umieścić blok kodu może rzucić wyjątek, spróbuj Kod blok jest znany jako kod chronione. Składnia polecenia / catch Użyj try przedstawia się następująco:

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

Jeślispróbujesz blok w różnych kontekstach rzuci inny wyjątek, tym razem można spróbować wymienić wiele instrukcji catchzłapać różne rodzaje wyjątków.

Wyjątek

Można użyć instrukcjithrow gdziekolwiek w blok kodu zgłasza wyjątek.Argument stwierdzenie rzut może być dowolnego typu wyrazem wyniku ekspresji określa typ wyjątku rzucony.

Poniżej znajduje wyjątek Spróbuj zera podzielony na przykładach:

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

Złapać wyjątek

Blokcatch zablokiempróbowaćprzechwycić wyjątki. Można określić typ wyjątku, który chcesz przechwycić, która została zgłoszona przez wyjątek w nawiasach po decyzji kluczowych haczyk.

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

Powyższy kod przechwyci wyjątek typuExceptionName.Jeśli chcesz złapać blok może obsługiwać każdy rodzaj wyjątku wrzucony bloku try, należy użyć wyjątku w nawiasach elipsy ... oświadczenie, w następujący sposób:

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

Oto przykład z dzielenia przez zero, zgłasza wyjątek, a wyjątek zostanie złapany w bloku 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;
}

Ponieważ rzucać typuconst char * wyjątek, dlatego gdy zapadka ten wyjątek, musimy użyć const char * w bloku catch.Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Division by zero condition!

C ++ standardowe wyjątki

C ++ zapewnia zestaw standardowych wyjątków określonych w<> wyjątku, możemy użyć tych standardowych wyjątków w programie.Opierają się one na rodzicielstwa klasowej hierarchii zorganizowany w następujący sposób:

C ++ hierarchia wyjątków

W poniższej tabeli znajduje się opis każdego z powyższym pojawiają się zaburzenia hierarchii:

异常 描述
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 当发生数学下溢时,会抛出该异常。

Zdefiniować nowy wyjątek

Można zdefiniować nowy wyjątek odwyjątku klasy spadków i przeciążenia.Poniższy przykład pokazuje, jak używać klasy std :: exception, aby realizować własne wyjątki:

#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)
  {
    //其他的错误
  }
}

To daje następujące wyniki:

MyException caught
C++ Exception

Oto, co metoda () to klasa wyjątku publicznego pod warunkiem, że został przeciążony wszystkie sub klasy wyjątków.Będzie to powrót przyczynę tego wyjątku generowanego.