Latest web development tutorials

C ++ 예외 처리

예외가 발생하는 절차를 실행하는 동안 문제가된다. C ++ 예외는 특별한 프로그램은 제로 조작에 의해 분할하는 시도로, 실행되는 경우 발생을 의미한다.

예외는 프로그램 전송 제어 방법을 제공한다. 던져, 캐치를 시도: C ++ 예외 처리는 세 가지 키워드를포함한다.

  • 던져 : 문제가 발생하면 프로그램이 예외가 발생합니다.이 작업은 완료throw 키워드를 사용하여 수행됩니다.
  • 잡기 : 당신이 문제를 처리 할 경우, 예외가 예외 핸들러에 의해 체포된다.캐치 키워드는 예외를 포착하는 데 사용됩니다.
  • 시도 :블록 코드를시도하면특정 예외가 활성화되어 식별합니다. 뒤에 일반적으로 하나 이상의 캐치 블록 따른다.

블록 예외를 throw가있는 경우를 제외하고 방법을시도하고 캐치키워드를 사용 잡을 수있어. 블록 코드가 코드 보호로 알려져있다 시도 예외를 던질 수있는 코드의 블록을 배치하려고합니다. 다음과 같이 사용 시도 / catch 문 구문은 다음과 같습니다

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

다른 예외가 발생합니다 다른 상황에서 블록을시도 할 경우,이 시간은 예외의 다른 유형을 잡기 위해 여러 catch문을 나열 시도 할 수 있습니다.

예외를 던져

코드 블록에 예외를 throw에 당신은 어디서나throw 문을 사용할 수 있습니다.피연산자를 던져 문 식의 결과 어떤 식 타입 발생한 예외의 종류를 판단 할 수있다.

예외가 예제로 나눈 제로를 시도입니다 :

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

예외를 잡아라

try 블록 뒤에 catch블록은 예외를 촬영합니다. 당신은 캐치 키워드 결정 후 괄호 안에 예외로 선언 캡처 할 예외의 유형을 지정할 수 있습니다.

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

위의 코드는 타입ExceptionName 예외를 캡처합니다.당신은 예외 발생 try 블록의 모든 유형을 처리하기 위해 블록을 잡을하려면 다음과 같이 괄호 ... 생략에 명시된 예외를 사용해야합니다 :

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

여기에 0으로 나눗셈의 예에서 예외가 발생하고, 예외가 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를 숯불 * 예외가 발생하기 때문에, 때 캐치 그 예외, 우리는 catch 블록에서 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

여기, 무엇을 () 메소드는 모든 하위 예외 클래스를 오버로드 된 것을 제공하는 공공 예외 클래스입니다.이렇게 생성 된이 예외의 원인을 반환합니다.