문과 코린이의, [C. C++] 기록/C++ 이론

[문과 코린이의 IT 기록장] C++ - 예외처리와 관련된 또 다른 특성들 (new 연산자에 의해서 발생하는 예외, 모든 예외를 처리하는 catch 블록, 예외 던지기)

벼리네 2021. 7. 1. 18:10
반응형

[문과 코린이의 IT 기록장] C++ - 예외처리와 관련된 또 다른 특성들 (new 연산자에 의해서 발생하는 예외, 모든 예외를 처리하는 catch 블록, 예외 던지기)

[문과 코린이의 IT 기록장] C++ - 예외처리와 관련된 또 다른 특성들 

(new 연산자에 의해서 발생하는 예외, 모든 예외를 처리하는 catch 블록, 예외 던지기)

 


2021.07.01 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 예외상황과 예외처리의 이해 및 예외처리 매커니즘 (예외상황을 처리하지 않았을 때의 결과, if문을 이용한 예외처리, C++의 예외처리 매커니즘의 이해 : try와 cat..

 

[문과 코린이의 IT 기록장] C++ - 예외상황과 예외처리의 이해 및 예외처리 매커니즘 (예외상황을

[문과 코린이의 IT 기록장] C++ - 예외상황과 예외처리의 이해 및 예외처리 매커니즘 (예외상황을 처리하지 않았을 때의 결과, if문을 이용한 예외처리, C++의 예외처리 매커니즘의

vansoft1215.tistory.com

2021.07.01 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - Stack Unwinding(스택 풀기) (예외의 전달, 예외상황이 발생한 위치와 예외상황을 처리해야 하는 위치가 다른 경우, 스택 풀기, 자료형이 일치하지 않아도 예외 데이..

 

[문과 코린이의 IT 기록장] C++ - Stack Unwinding(스택 풀기) (예외의 전달, 예외상황이 발생한 위치와

[문과 코린이의 IT 기록장] C++ - Stack Unwinding(스택 풀기) (예외의 전달, 예외상황이 발생한 위치와 예외상황을 처리해야 하는 위치가 다른 경우, 스택 풀기, 자료형이 일치하지 않

vansoft1215.tistory.com

2021.07.01 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 예외상황을 표현하는 예외 클래스의 설계 (예외클래스와 예외객체, 상속관계에 있는 예외 클래스, 예외의 전달방식에 따른 주의사항)

 

[문과 코린이의 IT 기록장] C++ - 예외상황을 표현하는 예외 클래스의 설계 (예외클래스와 예외객

[문과 코린이의 IT 기록장] C++ - 예외상황을 표현하는 예외 클래스의 설계 (예외클래스와 예외객체, 상속관계에 있는 예외 클래스, 예외의 전달방식에 따른 주의사항) 2021.07.01 - [문

vansoft1215.tistory.com

 


1. new 연산자에 의해서 발생하는 예외

- new 연산에 의한 메모리 공간의 할당이 실패하면 bad_alloc이라는 예외가 발생

- bad_alloc은 헤더파일 <new>에 선언된 예외 클래스로서, 메모리 공간의 할당이 실패했음을 알리는 의도로 정의됨

 

Case 1 ) Bad_Alloc

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

int main() {
	int num = 0;

	try
	{
		while (1) {
			num++;
			cout << num << "번째 할당 시도" << endl;
			new int[10000][10000]; 
			// 메모리 할당관련 예외의 발생을 위해서, 반복해서 메모리 공간을 할당만 하고 있다.
		}
	}
	catch (bad_alloc & bad) // bad_alloc 예외 발생을 확인하기 위한 catch블록
	{
		cout << bad.what() << endl; 
		// what() : 예외의 원인정보를 문자열의 형태로 반환 (반환되는 문자열의 내용은 컴파일러에 따라 달라짐)
		cout << "더 이상 할당 불가!" << endl;
	}

	return 0;
}

 

 


2. 모든 예외를 처리하는 catch 블록

try
{
	...
}

catch( ... ) // 여기서 ...은 전달되는 예외를 다 받아주겠다는 선언
{
	...
}

이는 마지막 catch블록에 덧붙여지는 경우가 많다.

대신 catch 매개변수 선언에서 보이듯이, 발생한 예외와 관련해서 그 어떠한 정보도 전달받을 수 없으며, 전달된 예외의 종류도 구분이 불가능하다.

 

 


3. 예외 던지기

catch 블록에 의해 전달된 예외는 다시 던져질 수 있다.

그리고 이로 인해 하나의 예외가 둘 이상의 catch 블록에 의해 처리되게 할 수 있다.

 

Case 2 )

#include<iostream>
using namespace std;

void Divide(int num1, int num2) {
	try
	{
		if (num2 == 0) { throw 0; }
		cout << "몫 : " << num1 / num2 << endl;
		cout << "나머지 : " << num1 % num2 << endl;
	}
	catch (int expn)
	{
		cout << "first catch" << endl;
		throw; // 예외를 다시 던진다.
		// 즉, 이 문장에 의해, catch블록으로 전달된 예외가 소멸되지 않고 다시 던져진다.
		// 따라서 이 함수를 호출한 영역으로 예외가 전달된다.
	}
}

int main() {
	try
	{
		Divide(9, 2);
		Divide(4, 0);
	}
	catch (int expn)
	// Divide()에 의해 다시 전달된 예외가, 이 catch블록으로 전달된다.
	{
		cout << "second catch" << endl;
	}

	return 0;
}

 

이러한 사용법도 있지만, 예외처리는 가급적 간결한 구조를 띠는게 좋기 때문에, 정말로 필요한 상황이 아니라면 굳이 사용하고자 노력할 필요는 없다.

 

 

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형