상세 분석 C++이상 처리
이상 은 프로그램 통제 권 을 이전 하 는 방식 을 제공 했다.C++이상 처 리 는 세 가지 키워드 와 관련된다.try,catch,throw.
4.567917.throw:문제 가 발생 하면 프로그램 에 이상 이 발생 합 니 다.이것 은 throw 키 워드 를 사용 하여 완 성 된 것 입 니 다
한 블록 이 이상 을 던 지면 이상 을 포착 하 는 방법 은 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+이상 처리 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 원활 공사 & & 원활 공사 (차 트 법)모 성 은 도시 의 교통 상황 을 조사 하여 기 존의 도시 도로 통계 표를 얻 었 고 표 에는 모든 도로 가 직접 연 결 된 도시 가 열거 되 어 있다.성 정부의 '원활 한 공사' 목 표 는 성 전체의 어느 두 도시...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.