C++ 예외 처리: Try, Catch, Throw 예

예외 처리란 무엇입니까? C++?

예외 처리 C++ 런타임 오류와 같은 예상치 못한 상황을 처리하는 방법을 제공합니다. 따라서 예상치 못한 상황이 발생할 때마다 프로그램 제어는 핸들러라는 특수 기능으로 이전됩니다.

예외를 포착하려면 코드의 일부 섹션을 예외 검사에 배치합니다. 코드 섹션은 try-catch 블록 내에 배치됩니다.

해당 코드 섹션 내에서 예외 상황이 발생하면 예외가 발생합니다. 다음으로, 예외 처리기가 프로그램을 제어하게 됩니다.

예외적인 상황이 발생하지 않는 경우 코드는 정상적으로 실행됩니다. 핸들러는 무시됩니다.

이번에 C++ 튜토리얼에서 배울 내용은 다음과 같습니다.

왜 예외 처리인가?

다음은 예외 처리를 사용하는 이유입니다. C++:

  • 오류 처리 코드를 일반 코드와 분리합니다. 코드가 더 읽기 쉽고 유지 관리하기 쉬워집니다.
  • 함수는 자신이 선택한 예외를 처리할 수 있습니다. 함수에서 많은 예외가 발생하더라도 일부만 처리합니다. 호출자는 포착되지 않은 예외를 처리합니다.

예외 처리 키워드

예외 처리 C++ 다음 세 가지 키워드를 중심으로 진행됩니다.

  • 던져– 프로그램에 문제가 발생하면 예외가 발생합니다. throw 키워드는 프로그램이 던지기 작업을 수행하는 데 도움이 됩니다.
  • 따라– 프로그램은 예외 처리기를 사용하여 예외를 포착합니다. 문제를 처리해야 하는 프로그램 섹션에 추가됩니다. catch 키워드를 사용하여 완료되었습니다.
  • 시도– try 블록은 특정 예외가 활성화될 코드 블록을 식별합니다. 그 뒤에는 하나 이상의 catch 블록이 와야 합니다.

코드 블록이 예외를 발생시킨다고 가정해 보세요. 예외는 try 및 catch 키워드를 사용하는 메서드에 의해 포착됩니다. try/catch 블록은 예외를 발생시킬 수 있는 코드를 둘러싸야 합니다. 이러한 코드를 보호된 코드라고 합니다.

통사론

try/catch는 다음 구문을 사용합니다.

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • try 문은 하나이지만 catch 문은 여러 개 있을 수 있습니다.
  • ExceptionName은 포착할 예외의 이름입니다.
  • 예외1, 예외2 및 예외N은 예외를 참조하기 위해 정의된 이름입니다.

예 1 :

#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

출력:

예외 처리 키워드

다음은 코드의 스크린샷입니다.

예외 처리 키워드

코드 설명 :

  1. iostream 헤더 파일을 프로그램에 포함시켜서 사용하세요. 기능.
  2. 해당 기능을 사용하려면 프로그램에 벡터 헤더 파일을 포함하십시오.
  3. 프로그램의 std 네임스페이스를 호출하지 않고 해당 클래스에 포함합니다.
  4. main() 함수를 호출합니다. 프로그램 논리는 해당 본문 내에 추가되어야 합니다.
  5. 정수 데이터를 저장하기 위해 vec라는 벡터를 만듭니다.
  6. vec라는 벡터에 요소 0을 추가합니다.
  7. vec라는 벡터에 요소 1을 추가합니다.
  8. 코멘트. 다음 항목에서는 건너뜁니다. C++ 컴파일러.
  9. 예외를 포착하려면 try 문을 사용하세요. {는 try/catch 블록 본문의 시작을 표시합니다. 본문에 추가된 코드가 보호되는 코드가 됩니다.
  10. vec라는 벡터의 인덱스 2(세 번째 요소)에 저장된 요소에 액세스해 보십시오. 이 요소는 존재하지 않습니다.
  11. try/catch 블록 본문의 끝입니다.
  12. 예외를 잡아라. 반환된 오류 메시지는 ex 변수에 저장됩니다.
  13. 예외가 발생하면 콘솔에 일부 메시지를 인쇄합니다.
  14. catch 블록 본문의 끝입니다.
  15. 프로그램은 성공적으로 실행되면 값을 반환해야 합니다.
  16. main() 함수 본문의 끝입니다.

예 2 :

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {

	if (y == 0) {
		throw "Division by Zero!";
	}
	return (x / y);
}

int main() {
	int a = 11;
	int b = 0;
	double c = 0;

	try {
		c = zeroDivision(a, b);
		cout << c << endl;
	}
	catch (const char* message) {
		cerr << message << endl;
	}
	return 0;
}

출력:

예외 처리 키워드

다음은 코드의 스크린샷입니다.

예외 처리 키워드

코드 설명 :

  1. 해당 기능을 사용하려면 프로그램에 iostream 헤더 파일을 포함하십시오.
  2. 프로그램의 std 네임스페이스를 호출하지 않고 해당 클래스에 포함합니다.
  3. 두 개의 정수 인수 x와 y를 취하는 zeroDivision이라는 이름의 함수를 만듭니다. 이 함수는 double 결과를 반환해야 합니다.
  4. if 문을 사용하여 변수 인수 y의 값이 0인지 확인합니다. {는 if 본문의 시작을 표시합니다.
  5. y가 0인 경우 반환되거나 던져질 메시지입니다.
  6. if 문의 본문 끝입니다.
  7. zeroDivision 함수는 x/y 값을 반환해야 합니다.
  8. zeroDivision 함수 본문의 끝입니다.
  9. main() 메서드를 호출합니다. {는 이 메소드의 시작을 표시합니다.
  10. 정수 변수를 선언하고 값 11을 할당합니다.
  11. 정수 변수 b를 선언하고 값 0을 할당합니다.
  12. double 변수 c를 선언하고 값 0을 할당합니다.
  13. 예외를 포착하려면 try 문을 사용하세요. {는 try/catch 블록 본문의 시작을 표시합니다. 본문에 추가된 코드가 보호되는 코드가 됩니다.
  14. zeroDivision 함수를 호출하고 인수 a와 b, 즉 11과 0을 전달합니다. 이 연산의 결과는 변수 c에 저장됩니다.
  15. 콘솔에 변수 c의 값을 출력합니다.
  16. try/catch 블록 본문의 끝입니다.
  17. 예외를 잡아라. 반환된 오류 메시지는 변수 메시지에 저장됩니다.
  18. 콘솔에 반환된 오류 메시지를 인쇄합니다.
  19. catch 블록 본문의 끝입니다.
  20. 프로그램은 성공적으로 실행되면 값을 반환해야 합니다.
  21. main() 함수 본문의 끝입니다.

C++ 표준 예외

C++ 표준 예외

C++ 다음에 정의된 표준 예외 목록이 함께 제공됩니다. 수업. 이에 대한 설명은 다음과 같습니다.

예외 상품 설명
표준::예외 이것은 예외이며 모든 표준의 상위 클래스입니다. C++ 예외.
표준::bad_alloc 이 예외는 새 키워드에 의해 발생합니다.
표준::bad_cast 이는 Dynamic_cast에서 발생하는 예외입니다.
표준::나쁜_예외 예상치 못한 예외를 처리하는 데 유용한 장치입니다. C++ 프로그램.
표준::bad_typeid typeid에 의해 발생한 예외입니다.
표준::논리_오류 이 예외는 코드를 읽어 이론적으로 감지할 수 있습니다.
std::도메인_오류 이는 수학적으로 유효하지 않은 도메인을 사용한 후에 발생하는 예외입니다.
표준::invalid_argument 잘못된 인수를 사용하면 예외가 발생합니다.
표준::길이_오류 큰 std::string을 생성한 후 예외가 발생했습니다.
표준::범위 밖 at 메소드에 의해 던져졌습니다.
표준::런타임_오류 이는 코드를 읽어도 감지할 수 없는 예외입니다.
표준::overflow_error 이 예외는 수학적 오버플로가 발생한 후에 발생합니다.
표준::범위_오류 이 예외는 범위를 벗어난 값을 저장하려고 할 때 발생합니다.
표준::underflow_error 수학적 언더플로 발생 후 발생하는 예외입니다.

사용자 정의 예외

The C++ std::Exception 클래스를 사용하면 예외로 던져질 수 있는 객체를 정의할 수 있습니다. 이 클래스는 헤더. 클래스는 what이라는 가상 멤버 함수를 제공합니다.

이 함수는 char * 유형의 null로 끝나는 문자 시퀀스를 반환합니다. 예외 설명을 갖기 위해 파생 클래스에서 덮어쓸 수 있습니다.

예:

#include <iostream>
#include <exception>
using namespace std;

class newException : public exception
{
	virtual const char* what() const throw()
	{
		return "newException occurred";
	}
} newex;

int main() {

	try {
		throw newex;
		}
	catch (exception& ex) {
		cout << ex.what() << '\n';
	}
	return 0;	
}

출력:

사용자 정의 예외

다음은 코드의 스크린샷입니다.

사용자 정의 예외

코드 설명 :

  1. 우리 프로그램에 iostream 헤더 파일을 포함시킵니다. 오류 없이 해당 기능을 사용하겠습니다.
  2. 우리 프로그램에 예외 헤더 파일을 포함시킵니다. 오류 없이 기능을 그대로 사용하겠습니다.
  3. 클래스를 호출하지 않고 사용하려면 프로그램에 std 네임스페이스를 포함하세요.
  4. newException이라는 새 클래스를 만듭니다. 이 클래스는 예외 클래스를 상속받습니다. C++.
  5. 클래스 본문의 시작입니다.
  6. 예외 헤더 파일에 정의된 가상 멤버 함수 what()을 덮어씁니다. 그런 다음 우리 자신의 예외, 즉 새로운 예외를 설명하겠습니다.
  7. 새 예외 정의를 시작합니다.
  8. 새로운 예외가 발견되면 반환될 메시지입니다.
  9. 새 예외 정의가 끝납니다.
  10. newException 클래스 본문의 끝입니다. newex는 새로운 예외를 포착하는 데 사용되는 이름이며, 그 후에 newException이 호출됩니다.
  11. main() 함수를 호출합니다. 프로그램 논리는 해당 본문 내에 추가되어야 합니다. {는 본문의 시작을 표시합니다.
  12. try 문을 사용하여 예외를 표시해야 하는 코드를 표시합니다. {는 try/catch 블록 본문의 시작을 표시합니다. 이로 둘러싸인 코드는 보호됩니다.
  13. 발견되면 newex 예외를 발생시킵니다.
  14. 시도 본문의 끝입니다.
  15. 예외를 포착하려면 catch 문을 사용하세요. 예외 오류 메시지는 ex 변수에 저장됩니다.
  16. 콘솔에 예외 오류 메시지를 인쇄합니다.
  17. catch 문의 본문 끝입니다.
  18. 프로그램이 성공적으로 실행되면 값을 반환해야 합니다.
  19. main() 함수 본문의 끝입니다.

요약

  • 예외 처리 포함 C++, 런타임 오류를 처리할 수 있습니다.
  • 런타임 오류는 프로그램 실행 중에 발생하는 오류입니다.
  • 예외 처리는 프로그램에서 예상치 못한 상황을 처리하는 데 도움이 됩니다.
  • 예상치 못한 상황이 발생하면 프로그램 제어가 핸들러로 넘어갑니다.
  • 예외를 포착하려면 try-catch 블록 아래에 코드 섹션을 배치합니다.
  • throw 키워드는 프로그램에서 예외를 발생시켜 프로그램이 문제를 처리하는 데 도움이 됩니다.
  • try 키워드는 특정 예외가 활성화될 코드 블록을 식별하는 데 도움이 됩니다.
  • 예외 헤더 파일의 what() 함수를 덮어써서 예외를 정의할 수 있습니다.