C++의 이상 처리 상세 설명

4892 단어 C++예외 처리
프로그램의 오 류 는 컴 파일 시의 오류 와 실행 시의 오류 로 나 뉜 다.컴 파일 할 때의 오 류 는 주로 문법 오류 이다.예 를 들 어 문장 끝 에 가산 점 번호 가 없고 괄호 가 일치 하지 않 으 며 키워드 오류 등 이다.이런 오 류 는 쉽게 수정 된다.컴 파일 시스템 은 몇 번 째 줄 에 오류 가 있 고 어떤 오류 가 있 는 지 지적 하기 때문이다.실행 할 때의 오 류 는 쉽게 수정 되 지 않 습 니 다.그 중의 오 류 는 예측 할 수 없 거나 예측 할 수 있 지만 피 할 수 없 기 때 문 입 니 다.예 를 들 어 메모리 공간 이 부족 하거나 함 수 를 호출 할 때 배열 이 경 계 를 넘 는 등 오류 가 발생 합 니 다.이런 오류 에 대해 효과 적 인 예방 조 치 를 취하 지 않 으 면 정확 한 운행 결 과 를 얻 지 못 하고 프로그램 이 정상적으로 종료 되 지 않 거나 심각 한 다운 현상 이 나타 날 수 있다.우 리 는 프로그램 이 실 행 될 때의 오 류 를 이상 이 라 고 통칭 하고 이상 처 리 를 이상 처리 라 고 부른다.C++에서 제공 하 는 이상 처리 메커니즘 의 구조 가 뚜렷 하여 어느 정도 프로그램의 건장 성 을 확보 할 수 있다.
C++에서 이상 을 처리 하 는 과정 은 다음 과 같 습 니 다.실행 프로그램 에 이상 이 발생 하면 이 함수 에서 처리 하지 않 고 잘못된 정 보 를 던 져 서 이전 단계 의 함수 에 전달 하여 해결 할 수 있 습 니 다.이전 단계 가 해결 되 지 않 고 이전 단계 에 전달 하여 이전 단계 에서 처리 할 수 있 습 니 다.이렇게 한 단계 씩 업로드 합 니 다.최고 단계 까지 처리 할 수 없 으 면 시스템 함수 terminate 를 자동 으로 호출 하여 abort 종료 프로그램 을 호출 합 니 다.이러한 이상 처리 방법 은 같은 함수 에서 처리 하지 않 고 이상 유발 과 처리 메커니즘 을 분리 시킨다.이 때문에 바 텀 함 수 는 실제 임 무 를 해결 해 야 하고 이상 에 대한 처 리 를 지나치게 고려 하지 않 아 도 되 며 이상 처리 임 무 를 이전 함수 에 맡 겨 처리 해 야 한다.
C++의 이상 처리 메커니즘 은 세 부분 으로 구성 되 어 있 습 니 다.try(검사),throw(던 지기),catch(포획)입 니 다.검사 해 야 할 문 구 를 try 모듈 에 두 고 검사 문 에 오류 가 발생 했 습 니 다.throw 는 이상 을 던 지고 오류 메 시 지 를 보 내 며 catch 에서 이상 정 보 를 캡 처 하고 처리 합 니 다.일반 throw 에서 던 지 는 이상 은 catch 가 캡 처 한 이상 유형 과 일치 합 니 다.이상 처리 의 일반적인 형식 은 다음 과 같다.

  try
  {
    
    throw
  }
  catch( 1)
  {
     1
  }
  catch( 2)
  {
     2
  }
  ...
다음 에 우 리 는 예시 로 이상 처 리 를 보 여 준다.

#include "stdafx.h"
#include <iostream>
template <typename T>
T Div(T x,T y)
{
if(y==0)
throw y;//
return x/y;
}
int main()
{
int x=5,y=0;
double x1=5.5,y1=0.0;
try
    {
//
        std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
        std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
    }
catch(int)//
    {
        std::cout<<" 0, !"<<std::endl;//
    }
catch(double)//
    {
        std::cout<<" 0.0, !"<<std::endl;//
    }
return0;
}
결과:
상기 예제 코드 를 보면 두 번 째 쌍 정밀도 유형의 나눗셈 계산 도 이상 을 던 져 야 한다 고 물 을 수 있 습 니 다.실제 운행 과정 에서 그렇지 않 습 니 다.사실은 이 쌍 정밀도 유형 나눗셈 함수 가 실 행 된 적 이 없습니다.상기 프로그램의 실행 규정 은 함수 Div(x,y)를 호출 할 때 이상 이 발생 하고 함수 Div 의 문구 인'throw y'에서 이상 을 던 지 며 return x/y 를 아래로 실행 하지 않 습 니 다.이 어 catch 는 int 형식의 이상 을 포착 하고 이상 을 처리 합 니 다.마지막 으로'return 0'을 직접 실행 합 니 다.따라서 함수 Div(x1,y1)과 catch(double){}모듈 은 실행 되 지 않 았 습 니 다.만약 에 우리 가 y 의 값 을 1 로 바 꾸 면 결 과 는 다음 과 같다.

try 구문 모듈 을 실행 할 때 이상 이 발생 하지 않 으 면 catch 구문 블록 이 작 동 하지 않 고 절차 가 그 후의 구문 으로 계속 실 행 됩 니 다.상기 두 가지 결과 에서 알 수 있 듯 이 첫 번 째 throw 에서 던 진 int 유형 을 알 수 있 기 때문에 이 유형 을 처리 하 는 catch 를 찾 았 고 두 번 째 는 double 형식 을 던 져 서 double 유형 을 처리 하 는 catch 를 찾 았 다.
다음은 이상 처리 에 대해 몇 가 지 를 보충 합 니 다.(1)try 와 catch 블록 은 괄호 로 묶 어야 합 니 다.괄호 안에 한 문장 만 있어 도 괄호 를 생략 할 수 없습니다.(2)try 와 catch 는 쌍 을 지어 나타 나 야 합 니 다.trycatch 결과 에 try 블록 만 있 을 수 있 지만,다른 이상 정보 와 일치 하도록 catch 블록 이 여러 개 있 을 수 있 습 니 다.(3)catch 블록 에 이상 정 보 를 지정 하지 않 고 삭제 번호"..."를 사용 하면 모든 종류의 이상 정 보 를 캡 처 할 수 있 음 을 나타 낸다.(4)throw 에 표현 식 이 포함 되 지 않 으 면 현재 처리 중인 이상 정 보 를 다시 던 져 서 이전 catch 에 전달 합 니 다.(5)C++에서 이상 이 발생 하면 프로그램 이 캡 처 되 지 않 으 면 시스템 함수 terminate 를 자동 으로 호출 하여 abort 종료 프로그램 을 호출 합 니 다.
마지막 으로 똑 같 습 니 다.저 는 예 를 들 어 오늘 말 한 내용(개발 도구:vs 2010)을 정리 하 겠 습 니 다.

#include "stdafx.h"
#include <iostream>

template <typename T>
T Div(T x,T y)
{
if(y==0)
throw y;//
return x/y;
}

int main()
{
int x=5,y=1;
double x1=5.5,y1=0.0;
try
    {
//
        std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
        std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
    }
catch(...)//
    {
try
        {
            std::cout<<" !"<<std::endl;
throw;// catch
        }
catch(int)//
        {
            std::cout<<" 0, !"<<std::endl;//
        }
catch(double)//
        {
            std::cout<<" 0.0, !"<<std::endl;//
        }

    }

return0;
}

결과:

좋은 웹페이지 즐겨찾기