상세 분석 C++이상 처리

이상 은 프로그램 이 실행 되 는 동안 발생 하 는 문제 이다.C++이상 은 프로그램 이 실 행 될 때 발생 하 는 특수 한 상황 을 말 합 니 다.예 를 들 어 0 으로 나 누 기 를 시도 하 는 것 입 니 다.
이상 은 프로그램 통제 권 을 이전 하 는 방식 을 제공 했다.C++이상 처 리 는 세 가지 키워드 와 관련된다.try,catch,throw.
4.567917.throw:문제 가 발생 하면 프로그램 에 이상 이 발생 합 니 다.이것 은 throw 키 워드 를 사용 하여 완 성 된 것 입 니 다
  • catch:문 제 를 처리 하고 자 하 는 곳 에서 이상 처리 프로그램 을 통 해 이상 을 포착 합 니 다.catch 키 워드 는 이상 을 포착 하 는 데 사 용 됩 니 다
  • try:try 블록 에 있 는 코드 표 지 는 특정한 이상 을 활성화 합 니 다.그 뒤 에는 보통 하나 이상 의 catch 블록 이 따른다.
    한 블록 이 이상 을 던 지면 이상 을 포착 하 는 방법 은 try 와 catch 키 워드 를 사용 합 니 다.try 블록 에 이상 한 코드 를 던 질 수 있 습 니 다.try 블록 에 있 는 코드 는 보호 코드 라 고 합 니 다.try/catch 문 구 를 사용 하 는 문법 은 다음 과 같 습 니 다.
    
    try
    {
      //     
    }catch( ExceptionName e1 )
    {
      // catch  
    }catch( ExceptionName e2 )
    {
      // catch  
    }catch( ExceptionName eN )
    {
      // catch  
    }
    try 블록 이 서로 다른 상황 에서 서로 다른 이상 을 던 질 경우,이 럴 때 여러 개의 catch 문 구 를 나열 하여 서로 다른 유형의 이상 을 포착 할 수 있 습 니 다.
    이상 을 던지다
    코드 블록 에 있 는 모든 곳 에서 throw 문 구 를 사용 하여 이상 을 던 질 수 있 습 니 다.throw 문장의 조작 수 는 임의의 표현 식 일 수 있 습 니 다.표현 식 결과 의 유형 은 이상 한 종 류 를 결정 합 니 다.
    다음은 0 으로 나 누 어 이상 한 인 스 턴 스 를 던 지 는 것 입 니 다.
    
    double division(int a, int b)
    {
      if( b == 0 )
      {
       throw "Division by zero condition!";
      }
      return (a/b);
    }
    포획 이상
    catch 블록 은 try 블록 뒤 를 따라 이상 을 포착 하 는 데 사 용 됩 니 다.캡 처 하고 싶 은 이상 유형 을 지정 할 수 있 습 니 다.이것 은 catch 키워드 뒤의 괄호 안의 이상 성명 에 의 해 결 정 됩 니 다.
    
    try
    {
      //     
    }catch( ExceptionName e )
    {
     //    ExceptionName      
    }
    위의 코드 는 ExceptionName 의 이상 을 캡 처 합 니 다.catch 블록 이 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 char*의 이상 유형 을 던 졌 기 때문에 이 이상 을 포착 할 때 catch 블록 에서 const char*를 사용 해 야 합 니 다.위의 코드 가 컴 파일 되 고 실 행 될 때 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
    Division by zero condition!
    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
    수학 이 넘 칠 때 이 이상 을 던진다.
    새로운 이상 정의
    exception 클래스 를 계승 하고 다시 불 러 와 서 새로운 이상 을 정의 할 수 있 습 니 다.다음 실례 는 std::exception 클래스 를 사용 하여 자신의 이상 을 실현 하 는 방법 을 보 여 줍 니 다.
    
    #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
    여기 서 what()는 이상 클래스 가 제공 하 는 공공 방법 으로 모든 하위 이상 클래스 에 의 해 다시 로드 되 었 습 니 다.이것 은 이상 이 발생 한 원인 으로 돌아 갈 것 이다.
    이상 은 C++이상 처리 에 대한 상세 한 내용 을 상세 하 게 분석 하 는 것 입 니 다.C+이상 처리 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기