C++

예외 처리 - try, catch, throw 와 어설션 비교

Vetenir 2025. 1. 8. 20:56

try, catch, throw 문

 

try

예외가 발생할 수 있는 코드 블록을 중괄호로 감싸줍니다.

catch

예외를 catch 블록으로 넘겨줍니다.

throw

throw가 넘긴 예외를 받아서 처리합니다.

 

 

코드 예시

try {
	// 예외를 넘길 수 있는 코드
	throw 예외_값

} catch (예외_타입 예외_이름) {
	// 예외를 처리하는 코드
}
  • throw가 작동하면 throw 밑의 코드는 작동하지 않고 바로 catch로 이동.
  • 예외 값같은 타입의 catch가 작동합니다.
  • 코드 작성시 throw의 예외 값에 해당하는 catch 예외 형식을 만들지 않으면 오류가 발생.
  • 하지만 모든 예외의 짝을 맞추기 쉽지 않기에
    catch(…)문을 사용하면 명시하지 않은 나머지 모든 예외를 받아서 처리할 수 있습니다.
try {
	// 예외를 넘길 수 있는 코드
	throw 예외_값

} 
catch (예외_형식 예외_이름) {
	// 예외를 처리하는 코드
}
catch (...) {
	// 명시하지 않은 모든 예외를 처리하는 코드
}

 

 

 

스택 풀기

함수에서 예외 처리가 되지 않아서 함수를 호출한 쪽으로 전달되는 현상

#include <iostream>
using namespace std;

void function()
{
	throw 123;
	cout << "해당 cout은 출력되지 않음.";
}

int main()
{
	try
	{
		function();
	}
	catch (int num)
	{
		cout << "catch "<< num;
	}
	return 0;
}

실행 결과
catch 123

  • throw 가 있는 함수가 A함수에서 호출되는 상태에서 메인 함수가 A함수를 호출해도 스택이 쌓이고 풀리며 throw가 전달됩니다.

 

어설셜

  • 코드를 검증하여 예상치 못한 상황에서 프로그램 동작을 중단시키는 도구.
  • 안전성과 신뢰성을 높여줍니다.

assert(조건식);

<cassert> 헤더에 정의

  • 디버그 모드에서 오류가 생길 수 있는 부분을 검사할 수 있는 매크로.
  • 조건식에는 검사가 필요한 값이 올바른지 판단하는 조건식을 만들어 넣습니다.
  • 다시 말해 올바른 값이면 계속 true로 코드가 실행이 되지만
    잘못된 값이 해당 조건에 의해 false가 되면 프로그램 실행이 중단됩니다.

assert를 사용할 때 주의할 점

assert는 디버그 모드에서만 컴파일되므로 다른 코드에 영향을 주지 않는 코드로만 작성해야 합니다.

다시 말해서 assert는 디버그 도구일 뿐, 실행 중 발생가능한 에러에 대한 방어 코드로는 적합하지 않습니다.

 

 

 

try, catch, throw 와 assert 선택 상황

상황 assert try, catch, throw
디버깅 도구 O 사용할 수 있으나 꼼꼼히 작성해야함.
런타임 안전성 X O
에러를 복구할 필요가 있는 경우 X O
잘못된 상태의 빠른 파악 O assert에 비하면 부적합.