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에 비하면 부적합. |