
'try'와 'catch'는 프로그램이 코드나 데이터 문제로 인해 예외(exception)를 만났을 때 어떻게 처리할지를 정의하는 키워드입니다. 예외는 try 블록 안에서 발생하며, catch 블록은 try 블록에서 발생한 예외를 찾아 처리하는 역할을 합니다. Python, C++, JavaScript 등 많은 프로그래밍 언어가 try-catch 구문을 기본적으로 지원합니다.
이 글에서는 try-catch 구문이 무엇인지 살펴보고, C 언어에서 이를 구현하는 방법을 예제와 함께 알아보겠습니다.
Try-Catch 구문이란?
try 구문은 예외가 발생할 가능성이 있는 코드 블록을 정의합니다. 특정 종류의 예외가 발생하면 해당 예외는 catch 블록으로 전달됩니다. 만약 try/catch 블록이 예외를 제대로 처리하지 못하면, 컴파일러는 오류 메시지를 출력하거나 예외가 호출 스택(call stack)을 따라 상위로 전파되다가 처리되지 않은 채 프로그램이 비정상 종료될 수 있습니다.
try-catch 구문의 일반적인 문법은 다음과 같습니다.
try {
/*
오류가 발생할 가능성이 있는 코드 작성
*/
}
catch {
/*
발생한 오류를 처리하는 코드 작성
*/
}C 언어에서의 try-catch 구문
C 언어는 예외 처리를 기본적으로 지원하지 않으며, 내장된 예외 처리 메커니즘이 없습니다. 하지만 setjmp와 longjmp 함수를 사용하면 어느 정도 흉내를 낼 수 있습니다. 다만 C에는 가비지 컬렉터(garbage collector)가 없기 때문에, 스택을 되돌아갈 때 메모리를 해제할 방법이 없으면 예외 처리 방식이 비효율적이고 안전하지 않습니다. 따라서 메모리를 올바르게 관리하려면 컨텍스트 매니저(context manager) 개념을 함께 도입해야 할 수도 있습니다.
이제 코드를 점진적으로 개선해 가며 해결책을 만들어 보겠습니다. 여기서는 setjmp.h 헤더 파일에서 제공되는 두 함수인 longjmp와 setjmp를 활용합니다.
- setjmp: jmp_buf 타입의 변수를 인자로 받으며, 직접 호출될 때는 0을 반환합니다.
- longjmp: 동일한 jmp_buf 변수와 함께 두 개의 인자로 호출되면, setjmp 함수는 longjmp의 두 번째 인자 값과 일치하는 값을 반환합니다.
이를 활용한 구현 예제는 다음과 같습니다.
#include <stdio.h>
#include <setjmp.h>
#define TRY do { jmp_buf buf_state; if ( !setjmp(buf_state)) {
#define CATCH } else {
#define ENDTRY }} while(0)
#define THROW longjmp(buf_state, 1)
int main()
{
TRY {
printf("Try statement testing\n");
THROW;
printf("Statement should not appear, as the THROW block has already thrown the exception \n");
}
CATCH {
printf("Got Exception \n");
}
ENDTRY;
return 0;
}
위 C 프로그램에서 ENDTRY 매크로는 do-while 블록의 닫는 부분을 담당합니다. 실행 결과는 아래와 같습니다.

결론
프로그램이 실행 중에 데이터나 코딩 오류로 인해 예외를 만났을 때, 'try'와 'catch'는 이를 처리하는 방법을 정의합니다. 예외는 try 블록에서 발생하고, catch 블록에서 해당 오류를 찾아 처리합니다. 대부분의 프로그래밍 언어가 try-catch 블록을 지원하지만, C 언어는 기본적으로 지원하지 않습니다. 이 가이드에서는 setjmp와 longjmp 매크로를 활용해 C 언어에서도 try-catch 구문과 유사한 예외 처리 패턴을 구현하는 방법을 알아보았습니다.
저자 소개

Komal Batool Batool
새로운 기술과 아이디어를 연구하는 것에 큰 열정을 가지고 있으며, 그 계기로 LinuxHint에 글을 쓰고 있습니다. 주로 프로그래밍 언어와 컴퓨터 과학 관련 주제를 집중적으로 다루고 있습니다.