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

⚡ 스마트 요약

예외 처리 C++ try, catch, throw 구문을 사용하여 프로그램이 런타임 오류를 감지하고 처리하여 프로그램이 충돌하지 않도록 합니다. 이 섹션에서는 키워드, 구문, 표준 예외 및 사용자 정의 예외를 예제와 함께 학습합니다.

  • ⚠️ 무엇이다 : 예외 처리는 프로그램이 복구될 수 있도록 런타임 오류를 포착합니다.
  • 🔑 키워드 : `try`는 코드 테스트를 위해, `throw`는 예외를 발생시키기 위해, `catch`는 오류를 처리하기 위해 사용됩니다.
  • 🧾 구문 : 위험한 코드는 try 블록에 넣고, 오류 처리는 catch 블록에서 하세요.
  • 📚 일반적인 예외 사항: C++ 예외 헤더에 내장 예외를 제공합니다.
  • 🤖 AI 도움말: GitHub Copilot과 같은 AI 도구는 try-catch 블록과 오류 처리를 추가합니다.

C++ 예외 처리

예외 처리란 무엇입니까? 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;
}

출력:

예외 처리 키워드

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

예외 처리 키워드

Code 설명 :

  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;
}

출력:

예외 처리 키워드

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

예외 처리 키워드

Code 설명 :

  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;	
}

출력:

사용자 정의 예외

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

사용자 정의 예외

Code 설명 :

  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, throw, catch 키워드를 사용하면 프로그램이 충돌하는 대신 복구할 수 있습니다.

C++ `try`는 실패할 가능성이 있는 코드를 감싸고, `throw`는 오류 발생 시 예외를 발생시키며, `catch`는 발생한 예외를 처리하는 세 가지 키워드를 사용합니다.

위험한 코드는 try 블록 안에 넣고, 그 뒤에 try 블록에서 발생하는 특정 예외 유형을 처리하는 하나 이상의 catch 블록을 추가하세요.

표준 예외는 std::bad_alloc 및 std::out_of_range와 같이 일반적인 런타임 오류를 보고하는 예외 헤더에 내장된 예외 클래스입니다.

사용자 정의 예외는 std::exception에서 파생된 경우가 많은 사용자 지정 클래스로, what() 함수를 재정의하여 특정 오류 조건을 설명합니다.

GitHub Copilot과 같은 AI 비서는 위험한 코드를 try-catch 블록으로 감싸고, 사용자 지정 예외 클래스를 생성하며, 입력하는 동안 어떤 예외를 처리해야 하는지 제안합니다.

예. AI 기반 도구는 처리되지 않은 예외를 찾아내고, 일반적인 예외 처리 블록 대신 구체적인 예외 처리 블록을 제안하며, 의미 있는 오류 메시지를 추가하여 코드의 정확성을 높여줍니다. C++ 코드가 더 견고해집니다.

throw는 오류가 감지되었을 때 예외를 발생시키고, catch는 해당 예외를 수신하여 오류를 처리하거나 보고하는 코드를 실행합니다.

이 게시물을 요약하면 다음과 같습니다.