반응형
[문과 코린이의 IT 기록장] C++ - 예외처리와 관련된 또 다른 특성들
(new 연산자에 의해서 발생하는 예외, 모든 예외를 처리하는 catch 블록, 예외 던지기)
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;
}
이러한 사용법도 있지만, 예외처리는 가급적 간결한 구조를 띠는게 좋기 때문에, 정말로 필요한 상황이 아니라면 굳이 사용하고자 노력할 필요는 없다.
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |
반응형